首页 > 其他分享 >sleep和wait有什么区别?

sleep和wait有什么区别?

时间:2023-09-20 14:14:11浏览次数:28  
标签:释放 区别 休眠 线程 sleep 方法 wait

sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中断,也就是线程在休眠的过程中,如果收到中断信号,都可以进行响应并中断,且都可以抛出 InterruptedException 异常,那 sleep 和 wait 有什么区别呢?接下来,我们一起来看。

区别一:语法使用不同

wait 方法必须配合 synchronized 一起使用,不然在运行时就会抛出 IllegalMonitorStateException 的异常,如下代码所示:
image

初看代码好像没啥问题,编译器也没报错,然而当我们运行以上程序时就会发生如下错误:
image

而 sleep 可以单独使用,无需配合 synchronized 一起使用。

区别二:所属类不同

wait 方法属于 Object 类的方法,而 sleep 属于 Thread 类的方法,如下图所示:
image

区别三:唤醒方式不同

sleep 方法必须要传递一个超时时间的参数,且过了超时时间之后,线程会自动唤醒。而 wait 方法可以不传递任何参数,不传递任何参数时表示永久休眠,直到另一个线程调用了 notify 或 notifyAll 之后,休眠的线程才能被唤醒。也就是说 sleep 方法具有主动唤醒功能,而不传递任何参数的 wait 方法只能被动的被唤醒。

区别四:释放锁资源不同

wait 方法会主动的释放锁,而 sleep 方法则不会。接下来我们使用代码的方式来演示一下二者的区别。

sleep 不释放锁
接下来使用 sleep 是线程休眠 2s,然后在另一个线程中尝试获取公共锁,如果能够获取到锁,则说明 sleep 在休眠时会释放锁,反之则说明不会释放锁,实现代码如下:
image

以上代码的执行结果如下图所示:
image

从上述结果可以看出,在调用了 sleep 之后,在主线程里尝试获取锁却没有成功,只有 sleep 执行完之后释放了锁,主线程才正常的得到了锁,这说明 sleep 在休眠时并不会释放锁。

wait 释放锁
接下来使用同样的方式,将 sleep 替换成 wait,在线程休眠之后,在另一个线程中尝试获取锁,实现代码如下:
image

以上代码的执行结果如下图所示:
image

从上述结果可以看出,当调用了 wait 之后,主线程立马尝试获取锁成功了,这就说明 wait 休眠时是释放锁的。

区别五:线程进入状态不同

调用 sleep 方法线程会进入 TIMED_WAITING 有时限等待状态,而调用无参数的 wait 方法,线程会进入 WAITING 无时限等待状态。 代码演示:
image

以上代码的执行结果如下:
image

总结

sleep 和 wait 都可以让线程进入休眠状态,并且它们都可以响应 interrupt 中断,但二者的区别主要体现在:语法使用不同、所属类不同、唤醒方式不同、释放锁不同和线程进入的状态不同。 ​

标签:释放,区别,休眠,线程,sleep,方法,wait
From: https://www.cnblogs.com/hg-super-man/p/17717145.html

相关文章

  • fat16与fat32的区别
    分区大小FAT16簇大小FAT32簇大小16MB--32MB2KB不支持32MB--127MB2KB512bytes128MB--255MB4KB512bytes256MB--259M......
  • MyBatis中#和$的区别
    MyBatis中#{}和${}的用法说一下为什么要写这篇文章,最近面试有被问到,一下子想不出来有啥区别,想记录一下加深自己的理解,同时自己也经常用MyBatis-Plus忽略了XML文件的编写和使用,所以需要加深一下这块的知识一、例子1、#{}将传入的数据当作一个字符串,会对传入的数据加上一个双......
  • 缓存穿透,缓存击穿,缓存雪崩区别
    缓存穿透,缓存击穿,缓存雪崩区别发现自己有时候明明已经做过了,可能是缺少回顾总结,过了几天这部分知识就会忘的一干二净,一点有记不住,还有这三个概念有时候确实不太能把他分清楚,面试的时候也有让自己说清楚,说的一塌糊涂,所以总结一下一、缓存穿透,缓存击穿,缓存雪崩简单的区别缓存......
  • select count(*) 和 select count(1) 以及 select count(column) 的区别
      1. 一般情况下,SelectCount(*)和SelectCount(1)两者的返回结果是一样的  2. 假如表沒有主键(PK),那么count(1)比count(*)快,如果有主键PK的話,那count(主键)最快,如果你的表只有一个字段的话那count(*)就是最快的  3.count(*)跟count(1)的结果一样,都包括对NU......
  • FLOPS 和 FLOPs 的区别
    FLOPS:注意全大写,是floatingpointoperationspersecond的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。FLOPs:注意s小写,是floatingpointoperations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。注意在深度学习中,我们用......
  • redis和mysql的区别以及它们是如何配合使用的
    redis和mysql的区别:1、从类型上来说,mysql是关系型数据库,redis是缓存数据库。2、mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢。redis用于存储使用较为频繁的数据到缓存中,读取速度快。3、mysql和redis因为需求的不同,一般都是配合使用。mysql和redis的数据库类型,m......
  • python中dump和dumps的区别
    dumpdump是将json数据写进文件dumpsdumps是将字典类型的数据转换为字符串如果不能区分好这两个函数,就很容易犯这个错误:TypeError:init()gotanunexpectedkeywordargument'fp'(别问我为啥知道奥~)......
  • 并行insert出现library cache lock与cursor: pin S wait on X等待问题记录
    一、故障现象与紧急处理开发反馈凌晨5点左右应用出现大量报错 ORA-04021:timeoutoccurredwhilewaitingtolockobject,并且集中出现在insertim_message这个表的操作上,其他表不受影响。查看当时等待情况,发现确实有异常的内存等待,而且还可以看到sid=15和1347的会话在相互等待,......
  • 服务器与主机的区别
    服务器与主机的区别1、主机和服务器是相对而言的。主机一般是指个人使用的电脑PC机。而在专业术语中,主机仅是电脑的一部分。而常说的主机却往往代表整个电脑。服务器一般是指用于专业用的电脑PC机,在实质上,服务器和主机没有什么意义上的区别。主机如果做为服务器也是可以的,服务器也......
  • orcle和mysql的区别
    orcle和mysql的区别Oracle数据库产品是闭源同时也是收费的,MySQL是开源的项目(免费);Oracle是大型数据库,Mysql是中小型数据库;Oracle可以设置用户权限、访问权限、读写权限等,MySQL没有;Oracle有表空间的概念,MySQL没有;Oracle默认不自动提交,需要用户手动提交。Mysql默认是......