2012-01-03 64 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