小编典典

wait() 和 sleep() 的区别

all

wait()a和sleep()in Threads有什么区别?

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

为什么我们 同时 wait()拥有和sleep():它们的实现在较低级别如何变化?


阅读 122

收藏
2022-02-25

共1个答案

小编典典

A可以被另一个调用正在等待的监视器上的wait线程“唤醒”,而
a不能。此外,(and )
必须发生在监视器对象的块中,而不会:notifysleepwait``notify``synchronized``sleep

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

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

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

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

notifyAll如果有多个线程在监视器上等待,您也可以调用-
这将唤醒 所有
线程。然而,只有一个线程能够抓住监视器(记住它wait在一个synchronized块中)并继续执行——然后其他线程将被阻塞,直到它们能够获得监视器的锁。

另一点是你调用waitObject自己(即你在一个对象的监视器上等待),而你sleep调用Thread.

还有一点是,您可以从中获得虚假 唤醒wait(即等待恢复的线程无缘无故地恢复)。您应该 始终wait在某些条件下旋转,如下所示:

synchronized {
    while (!condition) { mon.wait(); }
}
2022-02-25