2016-12-15 50 views
1

下面是創建線程,數組的代碼啓動它們,然後調用加入他們:Java線程加入for循環,未知行爲輸出

public class JoinExample { 

private static class CodeForThread implements Runnable { 
    @Override 
    public void run() { 
     for (int i = 0; i < 5; i++) { 
      System.out.println(Thread.currentThread().getName() + " " + i); 
     } 
    } 
} 

public static void main(String[] args) throws InterruptedException { 
    Thread[] threads = new Thread[100]; 
    for (int i = 0; i < 100; i++){ 
     threads[i] = new Thread(new CodeForThread()); 
     threads[i].start(); 
    } 
    for (int i = 0; i < threads.length; i++) { 
     threads[i].join(); 
    } 
    System.out.println("All Done"); 
} 

} 

我知道,加入等待線程在繼續之前死亡,並且線程可能不按順序調用,但仍將完成其任務。問題是我的輸出中有這麼多異常。有人可以解釋爲什麼這樣的事情可能會發生:

Thread-60 0 
Thread-60 1 
Thread-60 2 
Thread-60 3 
Thread-60 4 
Thread-97 0 //*** 
Thread-59 0 
Thread-59 1 
Thread-59 2 
Thread-59 3 
Thread-59 4 

這是因爲那是在進入連接循環之前計劃開始的線程之一嗎?

+0

線程97輸出的其餘部分應該在下面的某處。不是嗎? – GurV

回答

1

這不是異常行爲。當調用線程#加入時,主線程只需等待該特定線程完成,然後繼續執行。因爲每個線程都有單獨的指令流,它們都將按照任意給定的順序執行,正如您通過隨機「異常值」所看到的那樣。