Java wait()方法究竟是如何工作的?

时间:2011-03-25 00:44:00

标签: java

考虑线程1正在运行以下代码:

while (true) { 
    synchronized (this) {
        wait();
        ...Do Something ...
    }
}

并且假设我们有线程2通知线程1,即:

synchronized (thread1)
    thread1.notify();
}

我的问题是让我们说线程1被唤醒,并且正在做某事(所以它当前正在运行)。然后让我们说thread2在thread1运行时会在thread1上通知。 thread1完成“做某事”后会再次运行吗?或者只是睡觉呢?

我的问题是否足够明确?

谢谢。

3 个答案:

答案 0 :(得分:4)

  

说线程1被唤醒了,并且正在做某事(所以它当前正在运行)。然后让我们说thread2在thread1运行时会在thread1上通知。 thread1完成“做某事”后会再次运行吗?或者只是睡觉呢?

后者。原始通知事件将传递给在notify / notifyAll调用时等待的线程。如果没有线程在等待,则通知不执行任何操作:事件将被丢弃。

  

然后可以排队等候吗?我想在新事件发生时通知线程,但不想让线程忙等待......这可能吗?

原始通知事件不会也不能排队。

如果您需要排队通知,则需要使用更高级别的并发类而不是wait / notify。例如Semaphore可以完成这项工作......没有忙等待。其他可能性包括CyclicBarrierCountdownLatch

答案 1 :(得分:2)

wait()通过纯粹停止线程的操作来工作,直到另一个线程通知它可以继续运行。 synchronized方法是一次只能由一个线程运行的方法。

线程在运行时不会被“通知”。

答案 2 :(得分:2)

如果线程正在运行,而另一个线程通知它,则通知被“浪费” - 它没有任何效果。如果第一个线程再次调用wait(),它将正常返回到等待池。