java - Java中 "wait()"与 "sleep()"之间的区别

标签 java multithreading wait sleep java-threads

线程中的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/

相关文章:

java - 无法将服务代理 (sun.jvm.hotspot.HSDB) 连接到在 Windows 7(32 位)上运行的 jvm

java - Java中的多线程编程,使用信号量

java - 这些 Java 线程是否处于死锁状态?

c# - 父任务不等待子任务

c - pthreads:等到 read() 返回值 > 0

java - 具有静态初始化参数的哈希集

java - 无法在 Spring Roo 中进行逆向工程 (DBRE)

java - 在Java中将文本文件读取到数组中

java - 将参数传递给 onProgressUpdate 时出现问题 - 异步方法

c# - 如果作为单独的任务启动,有没有办法取消 Parallel.ForEach 循环