说说Java多线程中wait()和sleep()的区别

Java面试题:说说Java多线程中wait()和sleep()的区别?

得分点:

所属的类型不同、对锁的依赖不同、返回的条件不同

标准回答:

wait()sleep()方法在多线程编程中有一些关键区别,包括它们所属的类型、对锁的依赖以及返回的条件。

  1. 所属的类型不同
    • wait()Object类的实例方法,只能在对象级别上调用。当线程调用wait()方法时,它会进入WAITING状态。
    • sleep()Thread类的静态方法,可以在任何地方调用。当线程调用sleep()方法时,它会进入TIMED_WAITING状态。
  2. 对锁的依赖不同
    • wait()方法依赖于同步锁,通常在synchronized块或方法内部调用。当线程调用wait()方法时,它会释放持有的锁,允许其他线程进入临界区。
    • sleep()方法不依赖于任何锁,它可以在任何地方使用,不会释放任何锁。
  3. 返回的条件不同
    • 调用wait()方法使线程进入等待状态,需要被其他线程通过notify()notifyAll()方法唤醒,从而返回到可运行状态。
    • 调用sleep()方法使线程进入超时等待状态,可以在指定的时间后自动返回可运行状态,不需要外部唤醒。

此外,wait()方法还支持带超时参数的形式,这将使线程进入TIMED_WAITING状态。在这种情况下,线程可以通过超时或者被其他线程调用notify()notifyAll()方法唤醒。

当使用Lock进行线程同步时,没有同步监视器的概念,此时需要使用Condition对象的方法来实现等待。Condition对象是通过Lock对象创建的,它的await()方法会导致线程进入WAITING状态,而带有超时参数的await()方法会导致线程进入TIMED_WAITING状态。当调用signal()signalAll()方法时,线程将被唤醒并返回可运行状态。这种方式适用于使用Lock进行线程同步的情况。

原创文章,作者:博主,如若转载,请注明出处:https://www.unmao.com/course/2291.html

下载资源版权归原作者所有,若有侵权,请邮件ziyeblog@126.com及时删除。

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
博主的头像博主管理员
上一篇 2026-07-04 16:52
下一篇 2026-07-04 16:53

相关推荐

发表回复

登录后才能评论
微信
QQ

博主邮箱:ziyeblog@126.com

打赏
展开教程