我已閱讀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實現並且不被規範要求嗎?
如果它沒有記錄爲特定要求,則不是特定要求。 – EJP