Java 中sleep()与wait()的区别

本文深入解析了Java中Sleep与Wait方法的区别,从原理、锁处理、使用场景、异常捕获等方面进行对比,揭示了两者在线程控制及同步通信中的角色与差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、原理不同


  • sleep()是Thread类的静态方法,是线程用来控制自身流程的,它会使此线程暂停执行指定的时间,而把执行机会让给其他的线程,等到计时时间到,此线程会自动苏醒。

  • wait()是Object类的方法,用于线程间的通信,这个方法会使当前拥有该对象锁的进程等待,直到其他线程调用notify()方法才醒来,也可以指定时间自己醒来。


二、锁的处理机制不同


  • sleep()方法的主要作用是让线程休眠指定一段时间,在时间到时自动恢复,不涉及线程间的通信,因此,调用sleep()方法并不会释放掉锁

  • 调用wait()方法的时候,线程会释放掉它所占用的锁,从而使线程所在对象中的其他synchronized数据可以被其他线程使用。


三、使用的区域不同


  • sleep()方法则可以放在任何地方使用。

  • wait()必须放在同步控制方法或者同步语句块中使用。


四、异常捕获不同


  • sleep()方法必须捕获异常,在sleep()的过程中,有可能别的其他对象调用其interrupt(),产生InterruptedException异常。

  • wait(),notify()以及notifyall()不需要捕获异常。


五、总结


sleep()不会释放锁标志,容易导致死锁的发生,所以一般情况下,不推荐使用sleep方法,而是使用wait方法。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值