首页 > 编程语言 >Java并发(二十一)----wait notify介绍

Java并发(二十一)----wait notify介绍

时间:2023-12-25 22:35:53浏览次数:32  
标签:obj Thread .... ---- 线程 notify Java wait

1、小故事 - 为什么需要 wait

  • 由于条件不满足(没烟干不了活啊,等小M把烟送过来),小南不能继续进行计算

  • 但小南如果一直占用着锁,其它人就得一直阻塞,效率太低

  • 于是老王单开了一间休息室(调用 wait 方法),让小南到休息室(WaitSet)等着去了,但这时锁释放开,其它人可以由老王随机安排进屋

  • 直到小M将烟送来,大叫一声 [ 你的烟到了 ] (调用 notify 方法)

  • 小南于是可以离开休息室,重新进入竞争锁的队列

2、wait notify 原理

  • Owner 线程发现条件不满足,调用 wait 方法,即可进入 WaitSet 变为 WAITING 状态

  • BLOCKED 和 WAITING 的线程都处于阻塞状态,不占用 CPU 时间片

  • BLOCKED 线程会在 Owner 线程释放锁时唤醒

  • WAITING 线程会在 Owner 线程调用 notify 或 notifyAll 时唤醒,但唤醒后并不意味者立刻获得锁,仍需进入 EntryList 重新竞争

3、API 介绍

  • obj.wait() 让进入 object 监视器的线程到 waitSet 等待

  • obj.notify() 在 object 上正在 waitSet 等待的线程中挑一个唤醒

  • obj.notifyAll() 让 object 上正在 waitSet 等待的线程全部唤醒

它们都是线程之间进行协作的手段,都属于 Object 对象的方法。必须获得此对象的锁,才能调用这几个方法,否则会报IllegalMonitorStateException

final static Object obj = new Object();
​
public static void main(String[] args) {
​
    new Thread(() -> {
        synchronized (obj) {
            log.debug("执行....");
            try {
                obj.wait(); // 让线程在obj上一直等待下去
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("其它代码....");
        }
    }).start();
​
    new Thread(() -> {
        synchronized (obj) {
            log.debug("执行....");
            try {
                obj.wait(); // 让线程在obj上一直等待下去
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("其它代码....");
        }
    }).start();
​
    // 主线程两秒后执行
    sleep(2);
    log.debug("唤醒 obj 上其它线程");
    synchronized (obj) {
        obj.notify(); // 唤醒obj上随机一个线程
        // obj.notifyAll(); // 唤醒obj上所有等待线程
    }
}

notify 的一种结果

20:00:53.096 [Thread-0] c.TestWaitNotify - 执行....
20:00:53.099 [Thread-1] c.TestWaitNotify - 执行....
20:00:55.096 [main] c.TestWaitNotify - 唤醒 obj 上其它线程
20:00:55.096 [Thread-0] c.TestWaitNotify - 其它代码....

notifyAll 的结果

19:58:15.457 [Thread-0] c.TestWaitNotify - 执行....
19:58:15.460 [Thread-1] c.TestWaitNotify - 执行....
19:58:17.456 [main] c.TestWaitNotify - 唤醒 obj 上其它线程
19:58:17.456 [Thread-1] c.TestWaitNotify - 其它代码....
19:58:17.456 [Thread-0] c.TestWaitNotify - 其它代码....

wait() 方法会释放对象的锁,进入 WaitSet 等待区,从而让其他线程就机会获取对象的锁。无限制等待,直到 notify 为止

wait(long n) 有时限的等待, 到 n 毫秒后结束等待,或是被 notify

 

标签:obj,Thread,....,----,线程,notify,Java,wait
From: https://www.cnblogs.com/xiaoyh/p/17157922.html

相关文章

  • HTML学习第四天:掌握表单与验证
    在今天的HTML学习中,我深入了解了表单元素和表单验证。早上,我开始学习各种表单元素,如文本框、单选框、复选框等。这些元素是构建交互式网页的关键。通过使用<input>标签和不同的类型属性,我可以创建各种类型的输入字段。这让我能够更好地控制用户输入,并确保用户能够按照我的要求提供......
  • Android 常用注解一览
    注解的使用有助于减少样板代码的编写,并提供了一种声明性的方法来描述代码的意图和行为。可以用于实现依赖注入,数据库映射、运行时权限处理等功能。 1.值约束类型注解@Nullable//变量、参数或返回值可能为null@NonNull//变量、参数或返回值不能为null@IntRange//......
  • ACL访问列表:
    配置好vlan10,vlan20,vlan30之后,分别配置好端口0,1,2,交换机也配置好网关,使三个PC机可以相互ping通。查看端口概览情况:ACL访问控制列表:使vlan10可以和vlan20下的PC机可以连通,vlan10但是不能和vlan30通信,从而达到控制通信网络。配置好连通网络后:Inbound对进来的包进行过滤,按......
  • app发送语音
    实现功能通过App发送语音指令,调度指定Web端的页面的操作,如打开项目一览表、打开项目工时等设计绑定因Web端可以打开多个,即多个人可以在多个电脑上打开Web端,所以怎么保证调度的是某一个Web端呢?通过Web端标识进行绑定,基于WebSocket,Web端先和服务端进行绑定并设置Web端标识;然后App端设......
  • 数据挖掘与机器学习之间有何区别?
    数据挖掘:侧重于从大量数据中提取有用的信息,以便进行决策支持或进一步的分析。数据挖掘更注重于数据的探索性和发现性。机器学习:侧重于开发算法和模型,以便从数据中学习并进行预测或决策。机器学习更注重于模型的训练和预测性能。......
  • 内网转换
    私网地址开头:disaclall可以查看:......
  • B/S和C/S的区别和联系
    1B/SB/S(Brower/Server)架构,也称为B/S结构或B/S模式,是Web兴起后的一种网络结构模式。在这种模式下,Web浏览器成为客户端最主要的软件。系统功能实现的核心部分被集中到服务器上,这简化了系统的开发、维护和使用。客户机上只需要安装一个浏览器,而服务器上则安装了SQLServer、Oracle、M......
  • 【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
    问题描述当在AppServiceforWindows环境中所列出的TomcatVersion没有所需要的情况下,如何实现自定义Tomcat环境呢? 问题解答第一步: 从官网下载要使用的 tomcat版本,解压到本地目录第二步:修改 conf/server.xml 配置文件将 port 改成 -1:将 Http-connectport 改成 ${po......
  • Maven学习笔记 - git-commit-id-plugin插件
    转载自:https://blog.csdn.net/mytt_10566/article/details/100116670参考:插件GitHub地址:https://github.com/git-commit-id/maven-git-commit-id-plugingit-commit-id-plugin是一个类似于buildnumber-maven-plugin的插件,由于buildnumber-maven-plugin插件仅支持CVS和......
  • 白嫖党福利:Navicat Premium16.3 免密激活永久教程(含Windows+Mac)
    1、Windows激活Navicat1.1说明本教程支持Windows环境下对于Navicat16.2.x、16.3.x的版本激活。1.2下载官方NavicatPremium安装包需先下载NavicatPremium,下载完成之后不要安装!已安装的需要进行卸载!获取渠道:本教程的激活包(后续也需要下载)中含有,评论区已置顶评论中获取。下载链......