2016-07-06 109 views
1

我對java中的線程執行順序有所懷疑。 這個例子Java中的線程執行順序

public class Thr implements Runnable { 
    String string = "Yes "; 
    public void run(){ 
     this.string = "No "; 
    } 
    public static void main (String args[]){ 
     Thr t = new Thr(); 
     new Thread(t).start(); 
     for(int i = 0; i < 10; i++) 
      System.out.println(t.string); 
    } 
    } 

給輸出:

Yes 
No 
No 
No 
No 
No 
No 
No 
No 
No 

我有紅色的這個話題 Java. The order of threads execution ,我很困惑,爲什麼字符串後,首先通過for循環更改爲無。 我因子評分,作爲主線程沒有大的工作要做,主線程將首先執行,並且輸出將是

Yes 
Yes 
Yes 
Yes 
Yes 
Yes 
Yes 
Yes 
Yes 
No 

當我把一些打印在run方法,而不是this.string =「無「然後,從運行方法打印最後打印。

+0

是的,但我認爲,作爲主線程沒有太多的工作,爲循環冷杉將被執行與是,然後新線程(t).start(); ,所以它會是,並在最後,沒有 – MGKP

+0

但是,當我把,例如,在運行System.out.println(「線程」),並在主循環System.out.println(「主」 ),程序在末尾打印出線程線程 – MGKP

+0

線程相互獨立運行。沒有定義的順序,它可能很好地發生你的預期。但是,如果你依靠這個,那就是純粹的運氣。 – zapl

回答

0

我想我已經知道發生了什麼。事情是,這個線程,主線程和新線程(t)是並行執行的。這是一種抽獎,因爲它們都要求處理器時間,所以,當主線程開始執行時,需要執行所有代碼,主線程花費處理器時間,並且它只打印第一個是,然後是新的線程(t)獲取他的處理器時間,將「是」更改爲否,並完成執行,並且主線程再次繼續執行。我做了一個小測試,並在

public class Thr implements Runnable { 
    String string = "Yes "; 
    public void run(){ 
    this.string = "No "; 
    } 
    public static void main (String args[]){ 
    Thr t = new Thr(); 
    Thread tr = new Thread(t); 
    tr.start(); 
    for(int i = 0; i < 10; i++) 
     System.out.println(t.string + tr.isAlive()); 
    } 
} 

和輸出

Yes true 
No false 
No false 
No false 
No false 
No false 
No false 
No false 
No false 
No false 
0

當使用線程可以肯定的一件事,你無法預測何時如果調用此線程甚至會開始:

new Thread(t).start(); 

當你調用它的線程中是「狀態進入準備好開始運行或運行狀態「,然後線程調度程序可以將線程置於運行狀態,如果他想,這有點複雜,但是當你有一堆線程時你無法預測會發生什麼,有時如果你啓動兩個線程,最後一個會先運行。欲瞭解更多關於該主題的信息,請參閱this

+0

我意識到這一點,但我只是困惑,爲什麼在運行this.string =「no」的情況下,它只會在第一次迭代後更改,而對於所有其他操作,它首先會執行主線程......即使我進行了5000次迭代,第一次迭代後它仍然從「是」更改爲「否」。由於它不包含很多工作要做,所以JVM可以更快運行嗎? – MGKP

+0

你可以知道的唯一的事情是沒有指定會發生什麼。編寫依賴於以特定順序執行的線程的任何代碼,或者在沒有特定的同步調用的情況下執行一個線程之前執行的代碼將保證在某個時刻失敗。不要這樣做,然後你不必擔心它。 –

+0

我很痛苦地意識到這一點:D,但這是我的java考試範例,所以我無法避免:) – MGKP