Java 线程连接创建线程的顺序运行



当我运行以下代码时,程序永远不会退出并卡在 while 循环中,这应该是预期的行为。

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 的特质之一 调度?

是的,这是预期的行为,注释了您的连接,超过 线程将同时访问您的集合,您将有竞争条件,在这种情况下,计数将相同 超过线程 所以基本上您将在同一位置添加多个元素,因此您将在集合中没有预期的项目数,因此循环条件将始终为true ,您的应用将不会退出。

由于您的连接未被注释,主线程将被阻塞,直到每个线程完成,当第一个线程启动并且主线程移动到连接时,主线程将被阻塞并等待第一个线程完成,然后再移动到循环的下一次迭代,因此您将没有任何并发访问"计数",因此所有添加的元素都将不同

最新更新