Java线程连接for for循环,输出

时间:2016-12-15 03:25:52

标签: java multithreading

这是创建线程数组的代码,启动它们,然后在它们上调用join:

public class JoinExample {

private static class CodeForThread implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
    }
}

public static void main(String[] args) throws InterruptedException {
    Thread[] threads = new Thread[100];
    for (int i = 0; i < 100; i++){
        threads[i] = new Thread(new CodeForThread());
        threads[i].start();
    }
    for (int i = 0; i < threads.length; i++) {
        threads[i].join();
    }
    System.out.println("All Done");
}

}

我知道join在继续之前等待线程死亡,并且线程可能无序调用,但仍将完成其任务。问题是我的输出中有异常值。有人可以解释为什么会发生这样的事情:

Thread-60 0
Thread-60 1
Thread-60 2
Thread-60 3
Thread-60 4
Thread-97 0 //***
Thread-59 0
Thread-59 1
Thread-59 2
Thread-59 3
Thread-59 4

这是因为那是在进入连接循环之前计划启动的线程之一吗?

1 个答案:

答案 0 :(得分:1)

这不是异常行为。在调用Thread#join时,主线程只需等待就可以继续执行该特定线程。因为每个线程都有一个单独的指令流,所以它们都将以任何给定的顺序执行,正如您在随机的“异常值”中看到的那样。