gpt4 book ai didi

Java Thread join 创建线程的顺序运行

转载 作者:行者123 更新时间:2023-12-02 12:21:37 25 4
gpt4 key购买 nike

当我运行以下代码时,程序永远不会退出并陷入 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,依此类推,以正确的编号顺序完成。

Is this expected behaviour or just one of the idiosyncrasies of the JVM scheduler?

最佳答案

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

如果你的连接没有注释,主线程将被阻塞,直到每个线程完成,当第一个线程启动并且主线程移动到连接时,主线程将被阻塞并等待第一个线程完成,然后再移动到循环的下一次迭代,因此您不会对“count”进行任何并发访问,因此所有添加的元素都会不同

关于Java Thread join 创建线程的顺序运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45737253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com