线程输出不符合预期

时间:2016-02-05 06:54:13

标签: java multithreading

这是我的计划。

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和斐济交替

1 个答案:

答案 0 :(得分: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());
    }
}