我在試圖弄清楚下面的代碼如何工作時遇到一些問題。在輸出中,我得到所有線程都表示他們很睏倦,然後Thread-1或Thread-0喚醒並且程序凍結。這些睡眠線程是如何工作的?
我知道Thread-1或Thread-0會被喚醒,因爲threads[5]
調用了notify()
函數,所以wait-set中的第一個線程會恢復生機。但是...如果threads[5]
中的線程被阻止,因爲wait()
被調用,它怎麼可能仍然調用wakeUp()
函數?
如果以某種方式它可以調用方法爲什麼wakeUpAll()
函數不起作用?如果我睡主線,爲什麼它能工作?
public class SleepingThreads extends Thread
{
Object lock;
public SleepingThreads(Object l) { lock=l; }
public void run()
{
System.out.println(this.getName()+" said: I am sleepy...");
synchronized(lock)
{
try { lock.wait(); } catch (InterruptedException e){}
System.out.println(this.getName()+" said: but now I woke up...");
}
}
public void wakeUp() { synchronized (lock) { lock.notify(); } }
public void wakeUpAll() { synchronized (lock) { lock.notifyAll(); } }
public static void main(String[] args) throws InterruptedException
{
Object lock = new Object();
SleepingThreads[] threads = new SleepingThreads[10];
for (int i=0; i<10;i++)
{
threads[i] = new SleepingThreads(lock);
threads[i].start();
}
threads[5].wakeUp();
//currentThread().sleep(200);
threads[5].wakeUpAll();
System.out.println("Done.");
}
}
我想我應該至少得到一個投票,我試圖告訴你,主線程是執行.. =) –
一般原理:如果你有一個沒有時間週期的「等待」來檢查一個條件,你(幾乎)肯定會有一個等待發生的錯誤。 – Voo
謝謝!我需要點數。 –