wait() 和 sleep() 之间的区别
2022-08-31 03:55:20
线程 和 线程 之间有什么区别?wait()
sleep()
我的理解是否正确,即 -ing 线程仍处于运行模式并使用 CPU 周期,但 -ing 不消耗任何 CPU 周期?wait()
sleep()
为什么我们两者都有和:它们的实现在较低级别上如何变化?wait()
sleep()
线程 和 线程 之间有什么区别?wait()
sleep()
我的理解是否正确,即 -ing 线程仍处于运行模式并使用 CPU 周期,但 -ing 不消耗任何 CPU 周期?wait()
sleep()
为什么我们两者都有和:它们的实现在较低级别上如何变化?wait()
sleep()
等待
可以通过另一个线程在监视器上调用通知
来“唤醒”,该线程正在等待,而睡眠
则不能。此外,(和)必须发生在监视器对象上的块中,而不:wait
notify
synchronized
sleep
Object mon = ...;
synchronized (mon) {
mon.wait();
}
此时,当前正在执行的线程等待并释放监视器。另一个线程可能执行
synchronized (mon) { mon.notify(); }
(在同一对象上)和第一个线程(假设它是监视器上唯一等待的线程)将唤醒。mon
如果有多个线程正在监视器上等待,您也可以调用 notifyAll
– 这将唤醒所有线程。但是,只有一个线程能够抓住显示器(请记住,在块中)并继续 - 然后其他线程将被阻止,直到它们可以获得显示器的锁定。wait
synchronized
另一点是,您调用对象
本身(即在对象的监视器上等待),而在线程
上调用。wait
sleep
还有一点是,您可以从中获得虚假的唤醒(即等待的线程无缘无故地恢复)。在旋转时,您应该始终等待
,如下所示:wait
synchronized {
while (!condition) { mon.wait(); }
}
一个尚未提及的关键区别是,在休眠时,线程不会释放它所持有的锁,而等待会释放所调用对象上的锁。wait()
synchronized(LOCK) {
Thread.sleep(1000); // LOCK is held
}
synchronized(LOCK) {
LOCK.wait(); // LOCK is not held
}