2016-02-05 184 views
1

这是我的程序。线程输出不按预期执行

class SimpleThread extends Thread { 
    public SimpleThread(String str) { 
     super(str); 
    } 
    public void run() { 
     for (int i = 0; i < 10; i++) { 
      System.out.println(i + " " + getName()); 
      try { 
       sleep((int)(1000)); 
      } catch (InterruptedException e) {} 
     } 
     System.out.println("DONE! " + getName()); 
    } 
} 



    class TwoThreadsTest { 
    public static void main (String[] args) { 
     new SimpleThread("Jamaica").start(); 
     new SimpleThread("Fiji").start(); 
    } 
} 

我得到输出

0 Jamaica 
0 Fiji 
1 Fiji 
1 Jamaica 
2 Jamaica 
2 Fiji 
3 Fiji 
3 Jamaica 
4 Fiji 
4 Jamaica 
5 Fiji 
5 Jamaica 
6 Fiji 
6 Jamaica 
7 Fiji 
7 Jamaica 
8 Jamaica 
8 Fiji 
9 Fiji 
9 Jamaica 
DONE! Fiji 
DONE! Jamaica 

我怀疑.. 1)线程牙买加被称为第一 要求它睡1000毫秒。 然后线程斐济被称为 它应该打印并要求进入睡眠1000毫秒。 但我得到如上所示的输出。 为什么它不交替和印刷线jamica和斐济

+0

阅读关于线程优先级 – Vasco

+3

没有guaranteee一个线程会后正好1000毫秒醒来取决于系统资源是否可用,可能需要更长的时间以及调度程序如何处理它。 – MartinS

+0

'System.out.println()'每次调用它需要不同的时间。 – Guy

回答

1

控制台输出不同步,因此它可能会在这种情况下,在封闭情况下的毛刺。 线程正在获取以正确顺序打印的命令,但打印本身需要不同的时间。

使主线程在启动Jamica后睡10,并且会在两个线程之间放置一段距离。

代码示例:(建立在OP代码):

class TwoThreadsTest extends Thread { // extends Thread addition 
    public static void main(String[] args) { 
     SimpleThread a = new SimpleThread("A"); 
     SimpleThread b = new SimpleThread("B"); 
     a.start(); 
     try { 
      sleep(10); // offsets Console Output de-synchronization 
     } catch (InterruptedException ex) { 
      // shouldn't happen 
     } 
     b.start(); 
    } 
} 

class SimpleThread extends Thread { 
    public SimpleThread(String str) { 
     super(str); 
    } 
    public void run() { 
     for (int i = 0; i < 10; i++) { 
      System.out.println(i + " " + getName()); 
      try { 
       sleep((int)(1000)); // (int) is redundant 
      } catch (InterruptedException e) {} 
     } 
     System.out.println("DONE! " + getName()); 
    } 
} 
+1

'main'中的睡眠会将'0 Jamaica'和'0 Fiji'之间的距离放在一起,但不能保证线程将交替打印。 – Guy

+0

@guy你是对的,但保证线程交替打印的方法需要通过wait \ sleep进行复杂的修改,同步线程或使用Concurrent库。这里的问题是控制台输出的非同步特性,而不是代码。 –

+0

这不是“控制台的性质”。这是应用程序代码。控制台输出_is_同步,这就是输出看起来不像“1 Jam2 Fiaijica”的原因。应用程序代码是_not_ synchronized,这就是为什么当两个线程竞相调用'System.out.println()'时,获胜者是不可预测的。 –