线程中的wait()
和sleep()
有什么区别?
我的理解是,wait()
-ing 线程仍处于运行模式并使用 CPU 周期,但 sleep()
-ing 不消耗任何 CPU 周期,正确吗?
为什么我们同时拥有 wait()
和 sleep()
?
它们的实现在较低级别有何不同?
最佳答案
一个wait
可以被另一个线程调用notify
“唤醒”在正在等待的监视器上,而 sleep
不能。此外,wait
(和notify
)必须发生在监视器对象上的synchronized
block 中,而sleep
则不会:
Object mon = ...;
synchronized (mon) {
mon.wait();
}
此时,当前正在执行的线程等待并释放监视器。另一个线程可能会做
synchronized (mon) { mon.notify(); }
(在同一个 mon
对象上)和第一个线程(假设它是在监视器上等待的唯一线程)将被唤醒。
您也可以调用notifyAll
如果多个线程正在监视器上等待 - 这将唤醒所有线程。但是,只有一个线程能够获取监视器(请记住,wait
位于 synchronized
block 中)并继续执行 - 其他线程将被阻塞,直到它们能够获取监视器的锁。
另一点是您在 Object
上调用 wait
本身(即,您在对象的监视器上等待),而您在 Thread
上调用 sleep
.
还有一点是,您可能会从 wait
中获得虚假唤醒(即正在等待的线程无明显原因地恢复)。在某些条件下旋转时,您应该始终等待
,如下所示:
synchronized {
while (!condition) { mon.wait(); }
}
关于java - Java中 "wait()"与 "sleep()"之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54938092/