gpt4 book ai didi

java - 为什么在一个循环中加入所有线程与一次启动和加入一个线程不同?

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

我准备了两个线程示例来展示。我的目标是创建 10 个线程,并使它们同时并行运行。另外,我希望我的应用程序在执行其他任何操作之前等待所有线程的执行。

<小时/>

在第一个示例中,线程立即启动并连接。这使得 JVM 等待刚刚加入的线程完成,然后再将另一个线程添加到数组中。 这不是我想要的行为。

public void example1() throws InterruptedException{
ExampleThread[] threads = new ExampleThread[10];
for(int i=0;i<10;i++){
threads[i] = new ExampleThread();
threads[i].start();
threads[i].join();
}
}
<小时/>

在第二个示例中,所有线程均已启动,并且一个单独的循环一次一个地连接它们。 这重现了我想要的行为。

public void example2() throws InterruptedException{
ExampleThread[] threads = new ExampleThread[10];
for(int i=0;i<10;i++){
threads[i] = new ExampleThread();
threads[i].start();
}
for (ExampleThread thread : threads) {
thread.join();
}
}
<小时/>

问题:

  • JVM 是否真的同时运行所有 join 方法?
  • 是否等待第一个 join 方法解析后再调用另一个方法?
  • 这是实现我所描述的行为的可靠方法吗? (除了ExecutorService,可能更好)

我试图了解java线程的标准行为。任何帮助将不胜感激。

最佳答案

join() 会阻塞,直到线程终止(如 @shmosel 所说)。因此,这意味着在第一个示例中,在 threads[i] 完成之前不会创建 threads[i+1]

在第二个示例中,所有线程均被创建并并行运行,然后等待每个线程完成。

关于java - 为什么在一个循环中加入所有线程与一次启动和加入一个线程不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192844/

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