wait 和 notify方法

目录

1.1 wait()方法

 wait 做的事情:

wait 结束等待的条件:

1.2 notify()方法 

1.3notifyAll方法

1.4wait()和sleep()对比


   由于线程之间是抢占式执行的, 因此线程之间执行的先后顺序难以预知. 但是实际开发中有时候我们希望合理的协调多个线程之间的执行先后顺序.

完成这个协调工作 , 主要涉及到三个方法
  • wait() / wait(long timeout): 让当前线程进入等待状态.
  • notify() / notifyAll(): 唤醒在当前对象上等待的线程.
    注意: wait, notify, notifyAll 都是 Object 类的方法.      

1.1 wait()方法

 wait 做的事情:

  • 使当前执行代码的线程进行等待. (把线程放到等待队列中)
  • 释放当前的锁
  • 满足一定条件时被唤醒, 重新尝试获取这个锁. wait 要搭配 synchronized 来使用. 脱离 synchronized 使用 wait 会直接抛出异常.

wait 结束等待的条件:

  • 其他线程调用该对象的 notify 方法.
  • wait 等待时间超时 (wait 方法提供一个带有 timeout 参数的版本, 来指定等待时间).
  • 其他线程调用该等待线程的 interrupted 方法, 导致 wait 抛出 InterruptedException 异常.

代码示例:  

public static void main(String[] args) throws InterruptedException {Object object = new Object();synchronized (object) {System.out.println("等待中");object.wait();System.out.println("等待结束");}
}

         这样在执行到object.wait()之后就一直等待下去,那么程序肯定不能一直这么等待下去了。这个时候就 需要使用到了另外一个方法唤醒的方法notify()。

1.2 notify()方法 

 notify 方法是唤醒等待的线程.

  • 方法notify()也要在同步方法或同步块中调用,该方法是用来通知那些可能等待该对象的对象锁的 其它线程,对其发出通知notify,并使它们重新获取该对象的对象锁。
  • 如果有多个线程等待,则有线程调度器随机挑选出一个呈 wait 状态的线程。(并没有 "先来后到")
  • notify()方法后,当前线程不会马上释放该对象锁,要等到执行notify()方法的线程将程序执行 完,也就是退出同步代码块之后才会释放对象锁。
package thread;public class Demo20 {public static void main(String[] args) {Object object = new Object();Thread t1 = new Thread(() -> {synchronized (object) {System.out.println("wait 之前");try {object.wait();//         object.wait(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println("wait 之后");}});Thread t2 = new Thread(() -> {try {Thread.sleep(3000);} catch (InterruptedException e) {throw new RuntimeException(e);}synchronized (object) {System.out.println("进行通知");object.notify();}});t2.start();       t1.start();}
}

运行结果: 

 

1.3notifyAll方法

notify()和notifyAll()方法都用来唤醒wait()阻塞方法。

        但是notify()方法一次只能某一个等待线程,而notifyAll()方法一次调用可以唤醒全部的相同锁对象的wait()方法。notifyAll()方法虽然能一次唤醒多个线程,但是多个线程要竞争锁,并不是同步执行,也是依次执行。

1.4wait()和sleep()对比

        前者是用于线程之间的通信的,后者仅是让线程阻塞一段时间。唯一的相同点就是都可以让线程放弃执行一段时间。

不同点:

wait()方法需要搭配synchronized锁使用,而sleep()则不用;
wait()是Object类的普通方法,而sleep()Thread类的静态方法。

 

 

 

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

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

相关文章

利用matlab处理netcdf文件中time变量的格式转换问题

我们通常读取的科研数据具有时间维度,因而通常用于数据运算的时候,最常使用的是(2003.567)等双精度格式的年份。本专栏提供了一个将nc文件中提供的时间变量的年-月-日转成-年。但是nc文件提供的time变量通常是以下两种格式&#x…

C语言入门学习 --- 2.分支与循环语句

第二章分支与循环语句 2.分支与循环语句 分支语句 ifswitch 循环语句 whiledo whilefor goto语句 2.1分支语句(选择结构) 2.1.1 什么是选择? 例:如果你努力,也许会成功。如果你不努力,你永远不会成功。这就是选择 2.1.2 if语句…

重学SpringBoot3-日志Logging

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-日志Logging 引言默认日志配置日志门面如何实现默认配置 自定义日志配置日志级别日志分组日志格式日志输出自定义 Logback 配置切换日志框架 日志使用方…

数据结构 - 链表 (四)

这篇博客将介绍带头循环的双向链表,实现链表的头部插入/删除,尾部插入/删除,查找,以及任意位置的插入删除。 1.结构 带头循环的双向链表的结构如下图所示,一个结点内部包含数据,以及分别指向前一个以及后…

LabVIEW质谱仪开发与升级

LabVIEW质谱仪开发与升级 随着科技的发展和实验要求的提高,传统基于VB的质谱仪系统已经无法满足当前的高精度和高效率需求。这些系统通常存在着功能不全和操作复杂的问题,影响了科研和生产的进度。为了解决这些问题,开发了一套基于LabVIEW开…

`PF_NETLINK` 是用于与内核通信的Socket族之一

PF_NETLINK 是用于与内核通信的Socket族之一。在Linux系统中,Netlink是一种用于内核与用户空间进程之间通信的机制,而PF_NETLINK Socket族则用于创建与Netlink通信相关的Socket。通过Netlink Socket,用户空间程序可以与内核进行双向通信&…

16. C++标准库

C标准库兼容C语言标准函数库,可以在C标准库中直接使用C语言标准函数库文件,同时C标准库增加了自己的源代码文件,新增文件使用C编写,多数代码放在std命名空间中,所以连接C标准库文件后还需要 using namespace std;。 【…

Python算法题集_搜索旋转排序数组

Python算法题集_搜索旋转排序数组 题33:搜索旋转排序数组1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【二分法区间判断】2) 改进版一【二分找分界标准二分法】3) 改进版二【递归实现二分法】 4. 最优算法5. 相关资源 本文为Pytho…

Qt使用Q_DECLARE_INTERFACE Q_INTERFACES宏实现接口类使用qobject_cast进行类型转换

在写抽象类或者接口的时候&#xff0c;肯定是不能继承QObject的 但是又想使用qobject_cast进行类型转换&#xff0c;使用以下办法就能实现 #ifndef FACTORYINTERFACE_H__ #define FACTORYINTERFACE_H__ #include <QObject> class FactoryInterface{ public:FactoryInterf…

【C++进阶】C++多态概念详解

C多态概念详解 一&#xff0c;多态概念二&#xff0c;多态的定义2.1 多态构成的条件2.2 什么是虚函数2.3 虚函数的重写2.3.1 虚函数重写的特例2.3.2 override和final 2.4 重载和重写&#xff08;覆盖&#xff09;和重定义&#xff08;隐藏&#xff09;的区别 三&#xff0c;抽象…

salesforce Multi-Line Layout中公式字段不能显示吗

在Salesforce的多行布局中&#xff0c;公式字段是可以显示的。但是&#xff0c;有一些限制和注意事项&#xff1a; 默认情况下&#xff0c;公式字段可能不会显示&#xff1a; 公式字段在多行布局中默认是不包含的。您可能需要手动编辑多行布局&#xff0c;将公式字段添加到布局…

QGIS 开发之旅一《二次开发环境搭建》

1、 安装QT 下载QT Index of /new_archive/qt 我选择的版本是 Qt5.14.2 2、安装VS2017 Downloads & Keys - Visual Studio Subscriptions。下载后选择windows通用平台开发和C 开发就可以了。 3、安装插件QT vs tools 搜索 qt vs tools&#xff0c;选择第一个安装 …

3642. 最大公约数和最小公倍数 考研上机真题

输入两个正整数 m和 n&#xff0c;求其最大公约数和最小公倍数。 输入格式 一行&#xff0c;两个整数 m和 n。 输出格式 一行&#xff0c;输出两个数的最大公约数和最小公倍数。 数据范围 1≤n,m≤10000 输入样例&#xff1a; 5 7输出样例&#xff1a; 1 35 #include…

框架和函数库的区别

框架和函数库在软件开发中各自扮演着重要的角色&#xff0c;但它们之间存在一些关键的区别。 首先&#xff0c;从目的上来看&#xff0c;框架旨在提供一个完整的解决方案和开发规范&#xff0c;使开发者能够高效地构建应用程序。它实现了大部分功能&#xff0c;并定义了开发人员…

【工具篇】Unity翻书效果插件Book-Page Curl Pro教程

目录 一.切换目标页 二.自动翻书到目标页 三.动态添加书页 四.按钮控制翻页

Python合并两张图片 | 先叠透明度再合并 (附Demo)

目录 前言正文 前言 用在深度学习可增加噪音&#xff0c;增加数据集等 推荐阅读&#xff1a;Pytorch 图像增强 实现翻转裁剪色调等 附代码&#xff08;全&#xff09; 正文 使用Pillow库来处理图像&#xff08;以下两张图来自网络&#xff09; 图一&#xff1a; 图二&…

​FastIce-Tech 企业官网开源模版:专为中小企业设计的轻量级网址

标题&#xff1a;FastIce-Tech 企业官网开源模版&#xff1a;专为中小企业设计的轻量级网址 中小企业在建立企业官网时常常面临着时间、资源和技术的限制。为了解决这些问题&#xff0c;FastIce-Tech 企业官网开源模版应运而生。它是一个基于 Vue.js、ElementUI 和 Vue-Router …

(一)运行起自己的chatGPT

一、运行步骤 前面所有步骤可以参见https://datawhaler.feishu.cn/docx/BwjzdQPJRonFh8xeiSOcRUI3n8b 二、注意 需要注意的是&#xff1a; 部署起来后&#xff0c;必须使用域名访问才能进入。用ip地址端口访问不成功 三、运行效果 gradio需要额外配置一个外部端口&#x…

springboot+nacos使用

依赖 nacos服务发现和注册的依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency><dependency><groupId>com.alibaba.cloud</g…

亿发解析:互联网浪潮席卷,新零售崛起成为未来十年无可忽视之势

随着人们消费能力和水平的提高&#xff0c;消费者对产品质量的关注已不再仅限于产品本身&#xff0c;而更加强调产品质量与消费服务体验的双重重要性。随着互联网、移动支付、快递物流等技术的发展&#xff0c;这些技术催生了零售领域的新模式、新经济和新业态&#xff0c;为新…