Java 执行多个线程并等待完成

Java execute multiple Threads and wait for completion

我正在编写一个小程序,用于更新服务器上的固件。我目前执行此操作的方法是通过 ProcessBuilder 发出命令,执行它并使用 exitCode = process.waitFor(); 等待命令完成。

其中一些固件更新可能需要几分钟,因此在设置多个系统时,如果单独完成,这些固件更新可能需要数小时。

我尝试创建线程,同时使用 CyclicBarrier,以确保同时启动所有固件更新。 (参见:Whosebug-Question: How to start two threads at “exactly” the same time

然而,我发现的问题是,我的程序将在启动所有线程后照常运行 - 在这种情况下将重新启动所有系统,如果它们仍在进程中,这可能会破坏它们更新固件。

如何确保在继续之前完成所有固件更新?我考虑过让程序休眠 10-15 分钟,但想要更可靠的方法。

除障碍外,您还可以使用 CountDownLatch。将 CountDownLatch 传递给每个线程,一旦固件更新完成,只需调用锁存器上的倒计时。在您的主线程中,启动所有线程后,您可以通过调用 latch.await 等待,它会一直等待所有其他线程完成。您可能会找到示例 here.

您甚至可以使用带有 1 的 CountDownLatch 作为发令枪的计数,这排除了 CyclicBarrier.

的使用

你需要Thread.join()方法。看例子:

public static void main(String[] args) throws InterruptedException {
        Runnable sleepTwoSeconds = () -> {
            try {
                Thread.sleep(2000);
                System.out.println("Sleeping finished");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        };
        Thread t1 = new Thread(sleepTwoSeconds);
        t1.start();
        Thread t2 = new Thread(sleepTwoSeconds);
        t2.start();
        t1.join();
        t2.join();
        System.out.println("Main thread continue.");

    }

“我如何确保在继续之前完成所有固件更新?”在 t1 和 t2 完成之前,主线程不会继续。