图文详解JUC:Wait与Sleep的区别与细节


目录

一.Wait()

二.Sleep()

三.总结Wait()与Sleep()的区别


一.Wait()

在Java中,wait() 方法是 Object类中的一个方法,用于线程间的协作。当一个线程调用wait() 方法时,它会释放对象的锁并进入等待状态,直到其他线程调用相同对象的 notify()或 notifyAll() 方法唤醒它。当其他线程调用相同对象的 notify() 后会唤醒一个处于等待状态线程,而如果是调用 notifyAll() 的话则会唤醒全部的等待状态的线程。

wait() 方法有几种不同的重载形式:

  1. wait():导致当前线程等待,直到另一个线程调用相同对象的notify()或notifyAll()方法。
  2. wait(long timeout):导致当前线程等待,直到另一个线程调用相同对象的notify()或notifyAll()方法,或者指定的时间(以毫秒为单位)已过。
  3. wait(long timeout, int nanos):导致当前线程等待,直到另一个线程调用相同对象的notify()或notifyAll()方法,或者指定的时间已过(以毫秒和纳秒为单位)。

在使用 wait()方法时,需要注意以下几点:

  1. 必须在同步块或同步方法中调用wait()方法,否则会抛出IllegalMonitorStateException异常。
  2. 调用wait()方法后,当前线程会释放对象的锁,但不会释放对象的所有权。
  3. 当一个线程在等待时被中断,会抛出InterruptedException异常。

在之前的文章中,我们有讲到Synchronized的实现会通过Monitor来监视当前线程,对于Monitor中的WaitSet区域就是用来存放被 wait() 置于等待状态的线程,从而就会释放当前锁。

而处于等待状态的线程收到其他线程调用相同对象的 notify()或 notifyAll() 方法唤醒后,就可以重新回到线程队列中去竞争这个锁。

二.Sleep()

在Java中,sleep() 方法是Thread类的一个静态方法,用于使当前线程暂停执行一段时间。它接受一个以毫秒为单位的参数,表示线程要睡眠的时间长度。调用sleep() 方法会导致当前线程暂时放弃CPU的执行权,但不会释放锁当睡眠时间结束或线程被中断时,线程会重新进入可运行状态。另外 sleep() 方法不会释放对象的锁,因此如果一个线程在同步块或同步方法中调用sleep() 方法,其他线程仍然无法访问该对象的同步块或同步方法。

三.总结Wait()与Sleep()的区别

总的来说,wait() 和sleep() 是Java中用于线程控制的两个不同方法,它们的主要区别在于用途和影响。

  1. 所属类和调用方式:

    • wait()方法属于Object类,因此只能在同步代码块或同步方法中调用,并且必须通过持有对象的锁来调用。
    • sleep()方法是Thread类的静态方法,可以在任何地方直接调用。
  2. 锁的释放:

    • 在调用wait()方法时,线程会释放对象的锁,并进入等待状态,直到被其他线程调用notify()notifyAll()唤醒。
    • 调用sleep()方法时,线程不会释放锁,它只是暂时放弃CPU的执行权,但其他线程依然无法访问该线程持有的锁。
  3. 用途:

    • wait()通常用于线程间的协作,例如一个线程等待另一个线程完成某个操作后再继续执行。
    • sleep()通常用于线程的时间控制,例如实现简单的定时功能或控制线程执行顺序。
  4. 异常处理:

    • wait()方法会抛出InterruptedException异常,因此在调用wait()方法时需要进行异常处理。
    • sleep()方法也会抛出InterruptedException异常,需要进行异常处理。
  5. 调用方式:

    • wait()方法需要在try-catch块中调用,或者将异常抛出给上层调用者处理。
    • sleep()方法也需要在try-catch块中调用,或者将异常抛出给上层调用者处理。

对于二者关于锁的释放的不同可以用下面这个图示来说明,wait方法就相对于让当前线程从工作房间里面出来, 去一个休息室休息,从而把当前房间让给其他线程工作;而sleep方法则相对于是让线程在房间里面原地休息一下,等休息够了后继续干活




 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见 

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

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

相关文章

常用的一些字符转换工具--web(在线进制转换)

十进制 转2进制, 16进制 十进制浮点数转16进制(4个Byte) http://www.speedfly.cn/tools/hexconvert/

基于EBAZ4205矿板的图像处理:11阈值系数可调的图像局部阈值二值化

基于EBAZ4205矿板的图像处理:11阈值系数可调的图像局部阈值二值化 先看效果 还是一样拿我的pynq当模特,然后用usb——HDMI采集卡把输出图像采集到电脑上。 注意看右边mobelxtem中的通过串口调节的参数, 我这里是实现了阈值系数可调的局部阈…

深入 Go 语言:使用 math/rand 包实现高效随机数生成

深入 Go 语言:使用 math/rand 包实现高效随机数生成 介绍math/rand 包的核心功能设计哲学应用场景 基础使用方法初始化和种子设置设置种子创建私有随机数生成器 基础函数详解生成整数生成特定范围的整数生成浮点数随机置乱数组 进阶技巧随机数的统计属性生成正态分布…

【MATLAB】Enigma机加密原理与自实现

文章目录 什么是EnigmaEnigma机加密通信流程Enigma的物理构造Enigma的加密设置Enigma加密通信密码重新设置Enigma加密消息拼接注意 Enigma的解密分解设置Enigma解密通信密码重新设置Enigma解密消息 Enigma的弱点MATLAB自实现Enigma加密与解密Enigma_functionRotate_functiontes…

macOS上使用qt creator编译调试ffmpeg.c

1 前言 上文macOS上将ffmpeg.c编译成Framework介绍了使用xocde将ffmpeg.c编译成Framework的方法,这里列举另外一种办法,就是用qt creator来完成这件事情。 编译环境如下: qt creator 9.0.2;ffmpeg release/6.1; 2 编译ffmpeg.c 大…

Unity WebGL全屏显示

一、删除footer节点 二、删除最下面点击事件绑定 修改Canvas宽高 canvas.style.width "960px"; canvas.style.height "600px"; 改成 canvas.style.width document.documentElement.clientWidth"px"; canvas.style.height document.document…

JavaScript循环结构

JS循环结构 1 while结构2 for循环3 foreach循环 1 while结构 几乎和JAVA一致 代码 /* 打印99 乘法表 */var i 1;while(i < 9){var j 1;while(j < i){document.write(j"*"i""i*j" ");j;}document.write("<hr/>");i…

runtime pm的实例分析

概念 运行时的PM与前文描述的系统级挂起到RAM时候的PM不太一样&#xff0c;它是针对单个设备&#xff0c;指系统在非睡眠状态的情况下&#xff0c;某个设备在空闲时可以进入运行时挂起状态&#xff0c;而在不是空闲时执行运行时恢复使得设备进入正常工作状态&#xff0c;如此&…

Linux-CentOS-7忘记密码-修改登录密码图文详解

Linux-CentOS-7忘记密码-修改登录密码图文详解 1.重启系统&#xff1a; 在登录界面&#xff0c;选择要登录的用户并点击"Power"按钮&#xff0c;然后选择"Restart"或"Reboot"重新启动系统。 在系统启动时持续按下 “e” 键进入编辑模式。 2…

抖店曝光率高,转化低,不知道怎么提升转化率?试试这四个方法

大家好&#xff0c;我是醒醒团队电商花花。 我们现在做抖音小店的商家或多或少都会遇到不出单&#xff0c;转化低的各种问题。 明明店铺的曝光不低&#xff0c;访客也不少&#xff0c;就是没转化。 下面我根据我们做店的经验&#xff0c;给大家分享一些问题所在&#xff0c;…

总结 UDP 的报文结构和注意事项

UDP协议端格式 UDP报文主体分为两个部分:UDP报头(占8个字节)UDP数据/UDP载荷UPD报头:源端口号目的端口号包长度校验和 1.源端口号&#xff1a;一般是客户端程序程序请求时&#xff0c;由系统自动指定&#xff0c;端口号范围是0~65535&#xff0c; 0 ~ 1023为知名端口号——占16…

数据分析(二)——导入外部数据,导入Excel数据,CSV文件,txt文件,HTML网页,数据抽取,DataFrame对象的loc属性与iloc属性

一.导入外部数据 1.导入.xIs或.xIsx文件 pd.read_ excel(io,sheet_ name,header) 1.1常用参数说明 ●io:表示.xIs或.xIsx文件路径或类文件对象 ●sheet name:表示工作表&#xff0c;取值如下表所示 ●header:默认值为0&#xff0c;取第一行的值为列名&#xff0c;数据为除列…