wait()a和sleep()in Threads有什么区别?
wait()
sleep()
我是否理解wait()-ing 线程仍处于运行模式并使用 CPU 周期但sleep()-ing 不消耗任何 CPU 周期是否正确?
为什么我们 同时 wait()拥有和sleep():它们的实现在较低级别如何变化?
A可以被另一个调用正在等待的监视器上的wait线程“唤醒”,而 a不能。此外,(and ) 必须发生在监视器对象的块中,而不会:notifysleepwait``notify``synchronized``sleep
wait
notify
sleep
wait``notify``synchronized``sleep
Object mon = ...; synchronized (mon) { mon.wait(); }
此时当前正在执行的线程等待 并释放监视器 。另一个线程可能会做
synchronized (mon) { mon.notify(); }
(在同一个mon对象上)和第一个线程(假设它是唯一在监视器上等待的线程)将被唤醒。
mon
notifyAll如果有多个线程在监视器上等待,您也可以调用- 这将唤醒 所有 线程。然而,只有一个线程能够抓住监视器(记住它wait在一个synchronized块中)并继续执行——然后其他线程将被阻塞,直到它们能够获得监视器的锁。
notifyAll
synchronized
另一点是你调用wait它Object自己(即你在一个对象的监视器上等待),而你sleep调用Thread.
Object
Thread
还有一点是,您可以从中获得虚假 唤醒wait(即等待恢复的线程无缘无故地恢复)。您应该 始终wait在某些条件下旋转,如下所示:
synchronized { while (!condition) { mon.wait(); } }