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

Java面试 潘老师 9个月前 (09-04) 174 ℃ (0) 扫码查看

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.panziye.com/javainterview/8622.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】