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 完成之前,主线程不会继续。
我正在编写一个小程序,用于更新服务器上的固件。我目前执行此操作的方法是通过 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 完成之前,主线程不会继续。