首页 > 解决方案 > 为什么在一个循环中加入所有线程与一次启动和加入一个线程不同?

问题描述

我准备了两个线程示例来展示。我的目标是创建 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();
        }
    }

问题:

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

标签: javaconcurrency

解决方案


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

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


推荐阅读