2014-03-01 21 views
1

我已閱讀SJCP考試SCJP 6 Mock exam for Threads的培訓。當JVM執行線程準備完成時,規範是否要求JVM發送線程實例上的通知?

我認爲66和67的答案是不正確的,因爲兩個問題的正確答案都是「c」(輸出不能保證是以上任何一個)。 我相信「c」是正確的答案,因爲當新線程啓動時可能會丟失量子時間點,但是對新線程的監控未鎖定。所以,當創建線程已經完成時,CPU上的執行主線程將繼續存在,因此程序將掛起而沒有任何內容會被打印到控制檯。通過插入Thread.sleep可以簡單地模擬上面丟失量子的情況。

但我的問題與上面的培訓無關。與OpendJDK實現的java.lang.Thread行爲有關的問題7.如果您將按照原樣運行代碼,那麼您將在控制檯上看到999999。

class Job extends Thread { 
private Integer number = 0; 

public void run() { 
    for (int i = 1; i < 1000000; i++) { 
     number++; 
    } 
} 

public Integer getNumber() { 
    return number; 
} 
} 

public class Test { 
public static void main(String[] args) throws InterruptedException { 
    Job thread = new Job(); 
    thread.start(); 
    synchronized (thread) { 
     thread.wait(); 
    } 
    System.out.println(thread.getNumber()); 
} 
} 

這是在我看來,線程是實施OpendJDK7上調用線程實例通知(也許notifyAll的)時,線程執行準備完成。我試圖找到與此行爲相關的任何文檔(在JMM和java.lang.Thread的javadocs中),但我沒有發現任何有助於確認這一事實的文檔。

所以,我的問題:是真的,發送notify/notifyAll(當線程執行完成時)依賴於具體的JRE實現並且不被規範要求嗎?

+0

如果它沒有記錄爲特定要求,則不是特定要求。 – EJP

回答

2

它在documentation of join()記錄(這是你應該使用的,而不是wait()方法):

此實現使用this.wait電話空調上this.isAlive的循環。當一個線程終止this.notifyAll方法被調用。建議應用程序不要在Thread實例上使用wait,notify或notifyAll。

+0

謝謝,這是我的問題的完整答案。 –

0

應該總是在while循環中調用等待以檢查條件,否則可能會看到虛假喚醒。

相關問題