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();}}
}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的停车位检测系统(Python+PySide6界面+训练代码)

摘要:开发停车位检测系统对于优化停车资源管理和提升用户体验至关重要。本篇博客详细介绍了如何利用深度学习构建一个停车位检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并结合了YOLOv7、YOLOv6、YOLOv5的性能对比&#xf…

HarmonyOS端云体化开发—创建端云一体化开发工程

云开发工程模板 DevEco Studio目前提供了两种云开发工程模板:通用云开发模板和商城模板。您可根据工程向导轻松创建端云一体化开发工程,并自动生成对应的代码和资源模板。在创建端云一体化开发工程前,请提前了解云开发工程模板的相关信息。 …

前端学习之HTML(第一天)

什么是HTML HTML是一种用来描述网页的一种语言&#xff0c;HTML不是一种编程语言&#xff0c;而是一种标记语言。 HTML标签 HTML 标签是由尖括号包围的关键词&#xff0c;比如 <html> HTML 标签通常是成对出现的&#xff0c;比如 <b> 和 </b> 标签对中的…

ROS 2基础概念#3:主题(Topic)| ROS 2学习笔记

在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;主题&#xff08;Topics&#xff09;是实现节点之间通信的主要机制之一。节点&#xff08;Node&#xff09;可以发布&#xff08;publish&#xff09;消息到话题&#xff0c;或者订阅&#xff08;subscribe&…

市场复盘总结 20240304

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率中 20% 最常用的…

格两例12345

osu/Lucky Roll gaming 周末osu有道题&#xff1a;lcg已知低位 def lcg(s, a, b, p):return (a * s b) % pp getPrime(floor(72.7)) a randrange(0, p) b randrange(0, p) seed randrange(0, p) print(f"{p }") print(f"{a }") print(f"{b …

幂等性设计

目录 前言 幂等性设计 幂等性设计处理流程 HTTP 幂等性 消息队列幂等性 基于kafka 前言 幂等性设计&#xff0c;就是说&#xff0c;一次和多次请求某一个资源应该具有同样的副作用。为什么我们要有幂等性操作&#xff1f;说白了&#xff0c;就两点&#xff1a;1、网络的…

LeetCode第125场双周赛个人题解

目录 100231. 超过阈值的最少操作数 I 原题链接 思路分析 AC代码 100232. 超过阈值的最少操作数 II 原题链接 思路分析 AC代码 100226. 在带权树网络中统计可连接服务器对数目 原题链接 思路分析 AC代码 100210. 最大节点价值之和 原题链接 思路分析 AC代码 10023…

大话C++之:对象内存模型

一般继承(无虚函数覆盖) 只有一个虚指针&#xff0c;指向一个虚表&#xff0c;虚函数按顺序从祖先节点开始插入到虚表上。字段按顺序从祖先节点开始插入到对象内存上 一般继承(有虚函数覆盖) 只有一个虚指针&#xff0c;指向一个虚表&#xff0c;虚函数按顺序从祖先节点开始&a…

桂院校园导航 静态项目 二次开发教程 2.0

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Campus-Guide 静态项目 2.0版本 升级日志 序号 板块 详情 1 首页 重做了首页&#xff0c;界面更加高效和美观 2 校园页 新增了 “校园指南” 功能&#xff0c;可以搜索和浏览校园生活指南…

【金三银四】每日一点面试题(Java--JVM篇)

1、说一下 JVM 的主要组成部分及其作用&#xff1f; JVM&#xff08;Java虚拟机&#xff09;是Java程序运行的核心组件&#xff0c;它负责将Java字节码翻译成底层操作系统能够执行的指令。JVM由以下几个主要组成部分构成&#xff1a; 类加载器&#xff08;Class Loader&#…

Modbus协议详细解析与案例分享

目录 Modbus协议详细解析与案例分享1. Modbus协议简介2. Modbus RTU和Modbus TCP的区别3. Modbus帧结构4. Modbus协议示例5. Modbus应用场景结语 Modbus协议详细解析与案例分享 1. Modbus协议简介 Modbus是一种串行通信协议&#xff0c;用于实现工业自动化设备之间的通信。它…

消息中间件|初识消息队列

文章目录 消息队列是什么&#xff1f;消息队列关键概念消息队列优点消息队列的应用场景异步处理应用解耦流量削峰消息通讯 常用消息队列中间件的对比 消息队列是什么&#xff1f; 消息队列&#xff08;Message Queue&#xff09;是一种用于在软件系统之间传递消息的通信机制。…

spring boot概述

SpringBoot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。 该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。 通过这种方式&#xff0c;SpringBoot致力于在蓬勃发展的快速应用开发…

实时抓取SKU商品属性详细信息API数据接口(淘宝,某音)

item_sku-获取sku详细信息 taobao.item_sku详细信息 API公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_sku 名称类型必须描述keyString是调用key&#xff08;演示示例&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地…

设计模式学习笔记 - 设计原则 - 3.里氏替换原则,它和多态的区别是什么?

前言 今天来学习 SOLID 中的 L&#xff1a;里氏替换原则。它的英文翻译是 Liskov Substitution Principle&#xff0c;缩写为 LSP。 英文原话是&#xff1a; Functions that use points of references of base classes must be able to use objects of derived classes withou…

python-分享篇-生成仿微信公众号推广的个性二维码(支持动态)

代码 生成仿微信公众号推广的个性二维码&#xff08;支持动态&#xff09;from MyQR import myqr # 要生成动态二维码&#xff0c;只需要将piture参数和save_name参数设置gif动图即可 myqr.run(wordshttps://blog.csdn.net/stqer/article/details/135553200, # 指定二维码包含…

JVM(内存区域划分)

JVM JVM - Java虚拟机 我们编写的 Java 程序, 是不能够被 OS 直接识别的 JVM 充当翻译官的角色, 负责把我们写的的 Java 程序 ,翻译给 OS “听”, 让 OS 能够识别我们所写的 Java 代码 JVM 内存区域划分 JVM 是一个应用程序, 在启动的时候, 会从 操作系统 申请到一整块很大的内…

AI-RAN联盟在MWC24上正式启动

AI-RAN联盟在MWC24上正式启动。它的logo是这个样的&#xff1a; 2月26日&#xff0c;AI-RAN联盟&#xff08;AI-RAN Alliance&#xff09;在2024年世界移动通信大会&#xff08;MWC 2024&#xff09;上成立。创始成员包括亚马逊云科技、Arm、DeepSig、爱立信、微软、诺基亚、美…

【dc-dc】AP510X单路低压差线性恒流芯片

说明 AP510X 是一系列外围电路简洁的单路线性 LED 恒 流芯片&#xff0c;适用于 3-60V 电压范围的 LED 恒流调光 领域。 AP510X 采用我司专利算法&#xff0c;可以实现高精度的恒 流效果&#xff0c;输出电流恒流精度≤ 3 &#xff05;&#xff0c;电源供电工作 范…