这是创建线程数组的代码,启动它们,然后在它们上调用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
这是因为那是在进入连接循环之前计划启动的线程之一吗?
答案 0 :(得分:1)
这不是异常行为。在调用Thread#join时,主线程只需等待就可以继续执行该特定线程。因为每个线程都有一个单独的指令流,所以它们都将以任何给定的顺序执行,正如您在随机的“异常值”中看到的那样。