2011-03-25 32 views
3

考虑到线程1运行下面的代码:Java wait()方法的工作原理是什么?

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

而且可以说我们有螺纹2通知线程1,即:

synchronized (thread1) 
    thread1.notify(); 
} 

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

我的问题清楚了吗?

谢谢。

+1

你为什么在同步块中“做某事”? – mre 2011-03-25 00:47:29

回答

4

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

后者。原语通知事件传递给notify/notifyAll调用时正在等待的线程。如果没有线程在等待,则通知不做任何事情:事件被丢弃。

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

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

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

2

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

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

+0

删除了那个错误,谢谢。 – Tim 2013-11-05 13:05:07

2

如果一个线程正在运行,并且另一个线程通知它,则通知被“浪费” - 它不起作用。如果第一个线程再次调用wait(),它将正常返回到等待池中。

相关问题