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

devtools/2024/9/22 22:37:30/


目录

一.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.ppmy.cn/devtools/41677.html

相关文章

练习题(2024/5/14)

1四数相加 II 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&#xff1a;n…

PyQt5 与 SIP 的版本对应关系

PyQt5 与 SIP 的版本对应关系 PyQt5 与 SIP 的版本之间有一定的对应关系&#xff0c;只有版本号相互匹配才能正确使用。一般来说&#xff0c;PyQt5 会支持多个版本的 SIP&#xff0c;但不同的 PyQt5 版本对应的 SIP 版本可能会有所不同。为了确保稳定性和兼容性&#xff0c;我…

1689 ssm社区老人危机干预系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java ssm社区老人危机干预系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主…

表字符集统一使用utf8mb4,核对规则为utf8mb4_bin

在 MySQL 数据库中&#xff0c;当提到“表字符集统一使用 utf8mb4&#xff0c;核对规则为 utf8mb4_bin”的时候&#xff0c;意思涉及到字符集和核对规则&#xff08;collation&#xff09;的设置。下面是这句话的具体解释&#xff1a; 字符集&#xff08;Character Set&#xf…

班组长不懂如何与下属沟通?教你用“三要四不要”沟通原则

班组长与员工关系和谐程度&#xff0c;对团队士气效率影响重大。 与员工关系融洽的班组长更能获得大家的信任和支持&#xff0c;还会促进团队凝聚力&#xff0c;激发员工的工作积极性和创新精神。 然而&#xff0c;有的班组长只有在安排工作、教导技能时充满自信&#xff0c;…

[蓝桥杯]真题讲解:AB路线(BFS+分层图)

[蓝桥杯]真题讲解&#xff1a;AB路线&#xff08;BFS分层图&#xff09; 一、视频讲解二、正解代码1、C2、python33、Java 一、视频讲解 [蓝桥杯]真题讲解&#xff1a;AB路线&#xff08;BFS分层图&#xff09; 二、正解代码 1、C #include<bits/stdc.h> #define INF …

5.9网络协议

由网卡发送数据通过网线进行发送&#xff0c;当网卡接收到信号以后将数据传给内核数据区&#xff0c;然后由操作系统交给相应的进程。 将数据进行发送的时候需要借助于网线实现&#xff0c;这个时候会出现当传输的数据比较远的时候就借助于中继器将信号进行再生扩大&#xff0…

VP Codeforces Round 944 (Div 4)

感受&#xff1a; A~G 其实都不难&#xff0c;都可以试着补起来。 H看到矩阵就放弃了。 A题&#xff1a; 思路&#xff1a; 打开编译器 代码&#xff1a; #include <iostream> #include <vector> #include <algorithm> #define int long long using na…