2012-01-03 37 views
2

多線程多線程程序的輸出預計不會

public class RaceData { 

public static void main(String[] args) { 

    class UnsafeSequence implements Runnable{ 
     private int value = 0; 

     /** Returns a unique value. */ 

     public void run(){ 

      synchronized (this) { 
       value = value +1; 
       System.out.printf("Thread %s and Count value is %d \n",Thread.currentThread().getName(),value); 
      } 
     } 
    } 

    UnsafeSequence s = new UnsafeSequence(); 
    Thread t1 = new Thread(s); 
    t1.setName("t1"); 
    t1.start(); 
    Thread t2 = new Thread(s); 
    t2.setName("t2"); 
    t2.start(); 
    Thread t3 = new Thread(s); 
    t3.setName("t3"); 
    t3.start(); 
    Thread t4 = new Thread(s); 
    t4.setName("t4"); 
    t4.start(); 
    Thread t5 = new Thread(s); 
    t5.setName("t5"); 
    t5.start();  
} 
} 

輸出:

Thread t1 and Count value is 1 
Thread t5 and Count value is 2 
Thread t3 and Count value is 3 
Thread t4 and Count value is 4 
Thread t2 and Count value is 5 

爲什麼沒有得到正確顯示的計數值? 不好意思,我正在修改我的問題是不是計數變量值, 我預計線程不執行,他們是有序的,但我開始一個其他後t1之後線程T2得到執行,因爲我t1靠後開始T2, 這裏。

+0

那麼,你在期待什麼?什麼是正確的? – 2012-01-04 00:03:50

+0

您對計數值有什麼期望? – 2012-01-04 00:05:12

+0

我想我們已經失去了她。 – 2012-01-04 08:20:17

回答

1

他們不會在你因爲預期雖然實際的打印是通過同步線程完成的順序執行,也不能保證各個線程將在同一時間到達(等待輪到自己)。

所有該​​保證是該塊由1個線程同時運行。

+0

謝謝bdares,我錯過了在操作系統 – 2012-01-04 00:09:58

5

countis顯示正確。每次線程訪問​​塊時,count都會遞增。

你不能指望線程可以訪問到​​塊以相同的順序,他們開始。

0

「價值」是私有的類UnsafeSequence其中你只有一個實例。每次在不同的線程中執行run()時,都會增加並打印值。輸出與我所期望的一致。

1

在您啓動線程犯規保證,他們將執行方式的順序。說,你開始了3個線程,T1,T2,T3。一旦你調用T1.start(),T2.start()和T3.start(),所有的線程移動到一個叫做runnable的狀態,這意味着等待CPU執行。 CPU隨機選擇這些線程中的任何一個並執行它們。這是併發編程的風險之一,默認情況下,執行順序是隨機的。

+0

的指示下創建和執行線程的要點,或者,這是主要優點之一 - 您可以獲得最高效的排序。如果您強制特定訂購,您只需支付強制特定訂購的成本。 – 2012-01-04 02:53:12