当我运行下面的代码时,程序永远不会退出并卡在while循环中,这应该是预期的行为。Java线程连接创建线程的顺序运行
public class MyClass implements Runnable {
public static final int NO_OF_THREADS = 100;
private static int count;
private static Set<Integer> set = new HashSet<>();
@Override
public void run() {
for(int i=0 ;i<10000; i++) {
set.add(count++);
}
}
public static void main(String[] args) throws Exception {
Thread[] threadArray = new Thread[NO_OF_THREADS];
for(int i=0; i<NO_OF_THREADS; i++) {
threadArray[i] = new Thread(new MyClass());
}
for(int i=0; i<NO_OF_THREADS; i++) {
threadArray[i].start();
//threadArray[i].join();
}
while(set.size()!=1000000) {}
}
}
随着join()取消注释,程序总是退出。此外,当我修改代码以打印线程所运行的序列并加入适当位置时,我发现Thread-0首先完成其任务,之后是Thread-1,然后以适当的编号顺序完成。
这是预期行为还是JVM 调度程序的特性之一?
这就是所谓的[竞争条件](https://en.wikipedia.org/wiki/ Race_condition) – litelite
比赛条件评论但未注释时。就是那个问题。 – azuri
因为'join'强制主线程在开始新线程之前等待线程完成,所以未注释时没有比赛。所以你一次只有一个线程。 – litelite