wait() 和 sleep() 之间的区别

2022-08-31 03:55:20

线程 和 线程 之间有什么区别?wait()sleep()

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

为什么我们两者都有和:它们的实现在较低级别上如何变化?wait()sleep()


答案 1

等待可以通过另一个线程在监视器上调用通知来“唤醒”,该线程正在等待,而睡眠则不能。此外,(和)必须发生在监视器对象上的块中,而不:waitnotifysynchronizedsleep

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

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

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

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

如果有多个线程正在监视器上等待,您也可以调用 notifyAll – 这将唤醒所有线程。但是,只有一个线程能够抓住显示器(请记住,在块中)并继续 - 然后其他线程将被阻止,直到它们可以获得显示器的锁定。waitsynchronized

另一点是,您调用对象本身(即在对象的监视器上等待),而在线程上调用。waitsleep

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

synchronized {
    while (!condition) { mon.wait(); }
}

答案 2

一个尚未提及的关键区别是,在休眠时,线程不会释放它所持有的锁,而等待会释放所调用对象上的锁。wait()

synchronized(LOCK) {
    Thread.sleep(1000); // LOCK is held
}


synchronized(LOCK) {
    LOCK.wait(); // LOCK is not held
}