2011-03-25 88 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(),它將正常返回到等待池中。

相關問題