当前位置: 首页 > news >正文

java 关于 Object 类中的 wait 和 notify 方法。(生产者和消费者模式!)

4、关于 Object 类中的 wait 和 notify 方法。(生产者和消费者模式!)
第一:wait 和 notify 方法不是线程对象的方法,是 java 中任何一个 java 对象都有的方法,因为这两个方法是 Object 类中自带的。
wait 方法和 notify 方法不是通过线程对象调用的。
第二:wait() 方法作用?
Object o = new Object();
o.wait();
表示:让正在 o 对象上活动的线程进入等待状态,无期限等待,直到被唤醒为止。
o.wait(); 方法的调用,会让“当前线程(正在 o 对象上活动的线程)”进入等待状态。
第三:notify方法作用?
Object o = new Object();
o.notify();
表示:唤醒正在 o 对象上等待的线程。

notifyAll() 方法:
这个方法是唤醒 o 对象上处于等待的所有线程。

例:
package com.su.test.threadtest;

import java.util.ArrayList;
import java.util.List;

/**

  • @author : sumeiping
  • @date : 2022-02-01 16:41
  • 1、使用 wait 方法和 notify 方法实现“生产者和消费者模式”
  • 2、什么是“生产者和消费者模式”
  •  生产线程负责生产,消费线程负责消费。
    
  •  生产线程和消费线程要达到均衡。
    
  •  这是一种特殊的业务需求,在这种特殊的情况下要使用 wait 方法和 notify 方法。
    
  • 3、wait 和 notify 方法不是线程对象的方法,是普通 java 对象都有的方法。java.lang.Object 根类
  • 4、wait 方法和 notify 方法建立在线程同步的基础之上。因为多线程要同时操作一个仓库。有线程安全问题。
  • 5、wait 方法作用:o.wait() 让正在 o 对象上活动的线程 t 进入等待状态,并且释放掉 t 线程之前占有的 o 对象的锁。
  • 6、notify 方法作用:o.notify() 让正在 o 对象上等待的线程唤醒,只是通知,不会释放 o 对象上之前占有的锁。
  • 7、模拟这样一个需求:
  •  仓库我们采用 List 集合。
    
  •  List 集合中假设只能存储 1 个元素。
    
  •  1 个元素就表示仓库满了。
    
  •  如果 List 集合中元素个数是 0,就表示仓库空了。
    
  •  保证 List 集合中永远都是最多存储 1 个元素。
    
  •  必须做到这种效果:生产 1 个消费 1 个。
    

*/
public class WaitNotify {
public static void main(String[] args) {
// 创建一个仓库对象,共享的。
List list = new ArrayList();

    // 创建2个线程对象// 生产者线程对象Thread t1 = new Thread(new Producer(list));t1.setName("生产者线程");// 消费者线程对象Thread t2 = new Thread(new Consumer(list));t2.setName("消费者线程");// 启动线程t1.start();t2.start();/*** 生产者线程--->java.lang.Object@47a2a66c* 消费者线程--->java.lang.Object@47a2a66c* 仓库已经空了* 生产者线程--->java.lang.Object@496550e8* 消费者线程--->java.lang.Object@496550e8* 仓库已经空了* 生产者线程--->java.lang.Object@4d5acd1c* 仓库已经有1个元素了* 消费者线程--->java.lang.Object@4d5acd1c* 仓库已经空了* 生产者线程--->java.lang.Object@8585ad3* 仓库已经有1个元素了* 消费者线程--->java.lang.Object@8585ad3* 生产者线程--->java.lang.Object@5a9b1c72* 消费者线程--->java.lang.Object@5a9b1c72* 生产者线程--->java.lang.Object@399af5d9* 仓库已经有1个元素了* 消费者线程--->java.lang.Object@399af5d9* 生产者线程--->java.lang.Object@22b3eddb* 仓库已经有1个元素了* 消费者线程--->java.lang.Object@22b3eddb* 仓库已经空了* 生产者线程--->java.lang.Object@6877a59c* ..........*/
}

}
// 生产线程
class Producer implements Runnable{
// 仓库
private List list;
public Producer(){}

public Producer(List list) {this.list = list;
}@Override
public void run() {// 一直生产(使用死循环来模拟一直生产)while (true){// 给仓库对象list加锁synchronized (list){if (list.size() > 0){   // 大于 0,说明仓库中已经有 1 个元素了。System.out.println("仓库已经有1个元素了");try {list.wait();    // 当线程进入等待状态,并且释放 Producer 之前占有的 list 集合的锁。} catch (InterruptedException e) {e.printStackTrace();}}// 程序执行到这来说明仓库是空的,可以生产Object obj = new Object();list.add(obj);System.out.println(Thread.currentThread().getName() + "--->" + obj);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 唤醒消费者进行消费//list.notify();list.notifyAll();}}
}

}
// 消费线程
class Consumer implements Runnable{
private List list;
public Consumer(){}

public Consumer(List list){this.list = list;
}@Override
public void run() {// 一直消费while (true){synchronized (list){if (list.size() == 0){System.out.println("仓库已经空了");try {list.wait();    // 仓库已经空了。消费者线程等待,释放掉 list 集合的锁} catch (InterruptedException e) {e.printStackTrace();}}// 程序执行到这里说明仓库中有数据,可以消费Object obj = list.remove(0);System.out.println(Thread.currentThread().getName() + "--->" + obj);try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}// 唤醒生产者进行生产//list.notify();list.notifyAll();}}
}

}

相关文章:

java 关于 Object 类中的 wait 和 notify 方法。(生产者和消费者模式!)

4、关于 Object 类中的 wait 和 notify 方法。(生产者和消费者模式!) 第一:wait 和 notify 方法不是线程对象的方法,是 java 中任何一个 java 对象都有的方法,因为这两个方法是 Object 类中自带的。 wait 方…...

YOLOv8姿态估计实战:训练自己的数据集

课程链接:https://edu.csdn.net/course/detail/39355 YOLOv8 基于先前 YOLO 版本的成功,引入了新功能和改进,进一步提升性能和灵活性。YOLOv8 同时支持目标检测和姿态估计任务。 本课程以熊猫姿态估计为例,将手把手地教大家使用C…...

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】链表—双向链表

目录 往期 1 -> 带头双向循环链表(双链表) 1.1 -> 接口声明 1.2 -> 接口实现 1.2.1 -> 双向链表初始化 1.2.2 -> 动态申请一个结点 1.2.3 -> 双向链表销毁 1.2.4 -> 双向链表打印 1.2.5 -> 双向链表判空 1.2.6 -> 双向链表尾插 1.2.7 -&…...

做测试还是测试开发,选职业要慎重!

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程,一周学完让你面试通过率提高90%!(自动化测试) 突然发现好像挺多人想投测开和测试的,很多人面试的时候也会被问到这几个职位的区别,然后有测…...

Java面试题总结200道(二)

26、简述Spring中Bean的生命周期? 在原生的java环境中,一个新的对象的产生是我们用new()的方式产生出来的。在Spring的IOC容器中,将这一部分的工作帮我们完成了(Bean对象的管理)。既然是对象,就存在生命周期,也就是作用…...

面试数据库篇(mysql)- 03MYSQL支持的存储引擎有哪些, 有什么区别

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。 MySQL体系结构 连接层服务层引擎层存储层 存储引擎特点 InnoDB MYSQL支持的存储引擎有哪些, 有什么区别 ? my…...

MySQL深入——25

Join语句如何优化? Join语句的两种算法,分别为Index Nested-Loop Join和Block Nested-Loop Join NLJ在大表Join当中还不错,但BNL在大表join时性能就差很多,很耗CPU资源。 如何优化这两个算法 创建t1,t2算法,在t1中…...

Docker运行时安全之道: 保障容器环境的安全性

引言 Docker作为容器化技术的领军者,为应用部署提供了灵活性和便捷性。然而,在享受这些优势的同时,必须重视Docker运行时的安全性。本文将深入研究一些关键的Docker运行时安全策略,以确保你的容器环境在生产中得到有效的保护。 1. 使用最小特权原则 保持容器以最小权限运…...

前后端分离项目Docker部署指南(上)

目录 前言 一.搭建局域网 1.搭建net-ry局域网,用于部署若依项目 2.注意点 二.安装redis 创建目录 将容器进行挂载 ​编辑 测试是否安装成功 ​编辑 三. 安装MySQL 创建文件夹 上传配置文件并且修改 .启动MySQL容器服务 充许远程连接 四.部署后端 使用…...

ARM 架构下国密算法库

目录 前言GmSSL编译环境准备下载 GmSSL 源码编译 GmSSL 源码SM4 对称加密算法SM2 非对称加密算法小结前言 在当前的国际形式下,国替势不可挡。操作系统上,银河麒麟、统信 UOS、鸿蒙 OS 等国产系统开始发力,而 CPU 市场,也是百花齐放,有 龙芯(LoongArch架构)、兆芯(X86…...

源码的角度分析Vue2数据双向绑定原理

什么是双向绑定 我们先从单向绑定切入,其实单向绑定非常简单,就是把Model绑定到View,当我们用JavaScript代码更新Model时,View就会自动更新。那么双向绑定就可以从此联想到,即在单向绑定的基础上,用户更新…...

动态规划(算法竞赛、蓝桥杯)--树形DP树形背包

1、B站视频链接&#xff1a;E18 树形DP 树形背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int n,V,p,root; int v[N],w[N]; int h[N],to[N],ne[N],tot; //邻接表 int f[N][N];void add(int a,int b){to[tot]b;ne[tot]h[a];h[a…...

electron打包前端项目

1.npm run build 打包项目文件到disk文件夹 2.安装electron:npm install electron 打开后进到/dist里面 然后把这个项目的地址配置环境变量 配置环境变量&#xff1a;在系统变量的path中添加进去 配置成功后&#xff0c;electron -v看看版本。 3.创建主程序的入口文件main.…...

2.1基本算法之枚举7647:余数相同问题

已知三个正整数 a&#xff0c;b&#xff0c;c。 现有一个大于1的整数x&#xff0c;将其作为除数分别除a&#xff0c;b&#xff0c;c&#xff0c;得到的余数相同。 请问满足上述条件的x的最小值是多少&#xff1f; 数据保证x有解 #include<bits/stdc.h>//万能头 using…...

求最短路径之迪杰斯特拉算法

对fill用法的介绍 1.用邻接矩阵实现 const int maxn100; const int INF100000000;//无穷大&#xff0c;用来初始化边 int G[maxn][maxn];//用邻接矩阵存储图的信息 int isin[maxn]{false};//记录是否已被访问 int minDis[maxn];//记录到顶点的最小距离void Dijkstra(int s,in…...

python大学社团管理系统开发文档

项目介绍 一直想做一款大学社团管理系统&#xff0c;看了很多优秀的开源项目但是发现没有合适的。于是利用空闲休息时间开始自己写了一套管理系统。 在线体验 代码下载&#xff1a;https://github.com/geeeeeeeek/python_team演示地址&#xff1a;http://team.gitapp.cn/ &…...

leetcode 1328.破坏回文串

题目链接LeetCode1328 1.题目 给你一个由小写英文字母组成的回文字符串 palindrome &#xff0c;请你将其中 一个 字符用任意小写英文字母替换&#xff0c;使得结果字符串的 字典序最小 &#xff0c;且 不是 回文串。 请你返回结果字符串。如果无法做到&#xff0c;则返回一个…...

重学SpringBoot3-自动配置机制

重学SpringBoot3-自动配置机制 引言Spring Boot 自动配置原理示例&#xff1a;Spring Boot Web 自动配置深入理解总结相关阅读 引言 Spring Boot 的自动配置是其最强大的特性之一&#xff0c;它允许开发者通过最少的配置实现应用程序的快速开发和部署。这一切都得益于 Spring …...

sql基本语法+实验实践

sql语法 注释&#xff1a; 单行 --注释内容# 注释内容多行 /* 注释内容 */数据定义语言DDL 查询所有数据库 show databases;注意是databases而不是database。 查询当前数据库 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符…...

Node.js中的并发和多线程处理

在Node.js中&#xff0c;处理并发和多线程是一个非常重要的话题。由于Node.js是单线程的&#xff0c;这意味着它在任何给定时间内只能执行一个任务。然而&#xff0c;Node.js的事件驱动和非阻塞I/O模型使得处理并发和多线程变得更加高效和简单。在本文中&#xff0c;我们将探讨…...

PdrER算法:扩展解析在模型检查中的高效应用

1. PdrER算法核心原理与技术突破1.1 传统PDR算法的局限性分析Property Directed Reachability&#xff08;PDR&#xff0c;也称为IC3&#xff09;是当前最先进的模型检查算法之一&#xff0c;广泛应用于硬件和软件系统的安全属性验证。该算法通过构建归纳不变量&#xff08;ind…...

2026 年 5 月 AI 热点:大模型、硬件、人形机器人全面升级

一、大模型技术突破 | LLM Technology Breakthroughs 1.1 OpenAI GPT‑5.5 正式成为ChatGPT默认模型 | GPT‑5.5 Becomes ChatGPT Default Model 英文内容 | English On May 5, 2026, OpenAI officially rolled out GPT‑5.5 Instant as the new default model for ChatGPT, …...

Qwen-Image-2512+LoRA:构建Godot 4.x原生像素编译工作流

1. 这不是“AI画图”&#xff0c;而是一次像素艺术工作流的底层重构你有没有试过在Godot 4.x里导入一张Stable Diffusion生成的“像素风”图&#xff0c;结果放大一看全是模糊的伪像素、边缘发虚、色阶溢出&#xff0c;连8-bit调色板都对不上&#xff1f;我去年帮三个独立游戏团…...

JEECG AI应用平台深度解析:业内唯一 JAVA 版开源 AI 应用平台,如何成为企业级 Dify 替代方案

JeecgBoot AI专题研究 | JEECG AI应用平台的能力全景、对比 Dify 的差异化优势与企业落地实践 为什么企业需要一个「长在业务里」的 AI 应用平台 过去两年&#xff0c;几乎每家公司都在尝试把大模型接进自己的系统。最常见的路径是搭一套 Dify、FastGPT 之类的 LLM 应用平台&a…...

hccl:昇腾 NPU 的“多卡通信库”

hccl&#xff1a;昇腾 NPU 的“多卡通信库” 之前帮朋友看多 NPU 训练的代码&#xff0c;发现他自己手写了很多通信算子&#xff08;AllReduce/Broadcast/AllGather 等&#xff09;——在多 NPU 之间传数据&#xff0c;光写通信层就写了 3,000 行&#xff0c;而且还不稳定&…...

大中小型企业数据层配置规模分析与选型指南

引言 在数字化转型浪潮中&#xff0c;数据已成为企业的核心资产。无论是初创公司、中型企业还是大型集团&#xff0c;构建一个稳定、高效、可扩展的数据层架构都是支撑业务发展的基石。然而&#xff0c;不同规模的企业在数据量、业务复杂度、团队能力和预算投入上存在显著差异&…...

2026年京东云OpenClaw/Hermes Agent配置Token Plan保姆级搭建分享

2026年京东云OpenClaw/Hermes Agent配置Token Plan保姆级搭建分享。OpenClaw是开源的个人AI助手&#xff0c;Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具…...

测试工程师如何进行测试计划制定?这5个步骤让你的计划更合理

对于软件测试从业者而言&#xff0c;一份合理可行的测试计划是项目测试工作的核心纲领&#xff0c;它不仅决定了测试活动的范围、方向与资源分配&#xff0c;更直接影响着项目的交付质量与进度管控。很多初级测试工程师常常将测试计划等同于测试时间列表&#xff0c;要么写得过…...

打卡信奥刷题(3292)用C++实现信奥题 P8976 「DTOI-4」排列

P8976 「DTOI-4」排列 题目背景 Update on 2023.2.1&#xff1a;新增一组针对 yuanjiabao 的 Hack 数据&#xff0c;放置于 #21。 Update on 2023.2.2&#xff1a;新增一组针对 CourtesyWei 和 bizhidaojiaosha 的 Hack 数据&#xff0c;放置于 #22。 构造一个排列 ppp&…...

AI落地实战指南:场景锚定、能力分层与人机协同五步法

1. 项目概述&#xff1a;这不是一场技术发布会&#xff0c;而是一份从业者手绘的路线图 “AI: The Journey Ahead”——这个标题乍看像某场科技峰会的宣传语&#xff0c;或是某本畅销书的副标题。但在我过去十二年跑遍制造业产线、教育机构机房、中小律所档案室、社区卫生站HIS…...