2013-08-03 33 views
1

使用下面的代碼之前完成:的Java自動等待線程啓動一個新的

package myapp; 

class Runner extends Thread { 
    public void run(){ 
     for(int i = 0; i < 11; i++){ 
      System.out.println("Hello " + i); 
     } 

     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

public class Class1 { 
    public static void main(String[] args){ 
     Runner t1 = new Runner(); 
     t1.start(); 

     Runner t2 = new Runner(); 
     t2.start(); 
    } 
} 

我得到以下輸出:

Hello 0 
Hello 1 
Hello 2 
Hello 3 
Hello 4 
Hello 5 
Hello 6 
Hello 7 
Hello 8 
Hello 9 
Hello 10 
Hello 0 
Hello 1 
Hello 2 
Hello 3 
Hello 4 
Hello 5 
Hello 6 
Hello 7 
Hello 8 
Hello 9 
Hello 10 

而我的輸出應該如下:

Hello 0 
Hello 0 
Hello 1 
Hello 1 
Hello 2 
Hello 2 
Hello 3 
Hello 3 
Hello 4 
Hello 4 
Hello 5 
Hello 5 
Hello 6 
Hello 6 
Hello 7 
Hello 7 
Hello 8 
Hello 8 
Hello 9 
Hello 9 
Hello 10 
Hello 10 

怎麼回事?我正在使用Eclipse標準版/ SDK版本:開普勒版本
版本ID:20130614-0229,jre7u25和jdk7u25。

+0

你爲什麼認爲應該以第二種方式打印? – Ankit

+0

因爲我沒有使用join(),並且它是來自示例的確切代碼。 – Adam

+0

你的期望是不正確的,輸出的順序被認爲是**未定義的**,並且永遠不會被指定爲任何特定的順序。 –

回答

4

這是你的問題:

for(int i = 0; i < 11; i++){ 
     System.out.println("Hello " + i); 
    } 

    try { 
     Thread.sleep(100); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

你先通過整個循環運行,然後才睡覺。將中的睡眠移到for循環中,看看會發生什麼。

+0

這就是我一直在尋找的東西。非常感謝你! – Adam

2

第一個輸出是正確的,你所期待的也是正確的。概率是百萬分之一中的一個。

雖然存在多個線程,但不能讓任何特定線程有機會運行。一旦發送到jvm(或者在本機程序爲CPU的情況下),它應該運行什麼線程。

1日放出來是正確的BCZ,代碼是如此之小,線程需要切換之前,甚至,它已經完成了它的任務。這就是爲什麼產量不被幹預。也許你可以嘗試更大的迭代次數,比如>10000,這樣你就可以理解這個概念。或者你可以嘗試運行代碼次數。您將(可能)從相同的代碼中獲得不同的輸出。

Ps:保持sleep作爲最後的指令,實際上沒有效果,因爲線程幾乎完成了它的生命,而你只是在等待死亡。

1

如果2個線程具有相同的優先級,則執行順序不保證(運行相同程序的兩次可能會產生不同的結果),它取決於託管的操作系統,因爲它是其工作調度之間的CPU線程。