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

新手上路,请多包涵

线程中的 wait()sleep() 有什么区别?

我的理解是 wait() 线程仍处于运行模式并使用 CPU 周期,但 sleep() 不消耗任何 CPU 周期是否正确?

为什么我们 同时 拥有 wait()sleep()

它们的实现在较低级别上有何不同?

原文由 Geek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 358
2 个回答

A wait 可以被另一个正在等待的监视器上调用 notify 的线程“唤醒”,而 sleep Also a wait (and notify ) must happen in a block synchronized on the monitor object whereas sleep does not:

 Object mon = ...;
synchronized (mon) {
    mon.wait();
}

此时当前正在执行的线程等待 _并释放监视器_。另一个线程可能会做

synchronized (mon) { mon.notify(); }

(在同一个 mon 对象上)和第一个线程(假设它是等待监视器的唯一线程)将被唤醒。

您还可以调用 notifyAll 如果有多个线程正在等待监视器 - 这将唤醒 所有 线程。然而,只有一个线程能够获取监视器(记住 waitsynchronized 块中)并继续 - 其他线程将被阻塞直到它们可以获取监视器的锁。

Another point is that you call wait on Object itself (ie you wait on an object’s monitor) whereas you call sleep on Thread .

还有一点是,您可以从 wait 获得 虚假 唤醒(即正在等待的线程没有明显原因恢复)。你应该 始终 wait 同时在某些条件下旋转, 如下所示:

 synchronized {
    while (!condition) { mon.wait(); }
}

原文由 oxbow_lakes 发布,翻译遵循 CC BY-SA 4.0 许可协议

尚未提及的一个关键区别是:

  • sleep() 释放它持有的线程锁,
   synchronized(LOCK) {
      Thread.sleep(1000); // LOCK is held
  }

  • wait() 释放 它持有的对象上的锁。
    synchronized(LOCK) {
       LOCK.wait(); // LOCK is not held
   }

原文由 Robert Munteanu 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题