线程中的 wait()
和 sleep()
有什么区别?
我的理解是 wait()
线程仍处于运行模式并使用 CPU 周期,但 sleep()
不消耗任何 CPU 周期是否正确?
为什么我们 同时 拥有 wait()
和 sleep()
?
它们的实现在较低级别上有何不同?
原文由 Geek 发布,翻译遵循 CC BY-SA 4.0 许可协议
线程中的 wait()
和 sleep()
有什么区别?
我的理解是 wait()
线程仍处于运行模式并使用 CPU 周期,但 sleep()
不消耗任何 CPU 周期是否正确?
为什么我们 同时 拥有 wait()
和 sleep()
?
它们的实现在较低级别上有何不同?
原文由 Geek 发布,翻译遵循 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 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
A
wait
可以被另一个正在等待的监视器上调用notify
的线程“唤醒”,而sleep
Also await
(andnotify
) must happen in a blocksynchronized
on the monitor object whereassleep
does not:此时当前正在执行的线程等待 _并释放监视器_。另一个线程可能会做
(在同一个
mon
对象上)和第一个线程(假设它是等待监视器的唯一线程)将被唤醒。您还可以调用
notifyAll
如果有多个线程正在等待监视器 - 这将唤醒 所有 线程。然而,只有一个线程能够获取监视器(记住wait
在synchronized
块中)并继续 - 其他线程将被阻塞直到它们可以获取监视器的锁。Another point is that you call
wait
onObject
itself (ie you wait on an object’s monitor) whereas you callsleep
onThread
.还有一点是,您可以从
wait
获得 虚假 唤醒(即正在等待的线程没有明显原因恢复)。你应该 始终wait
同时在某些条件下旋转, 如下所示: