gpt4 book ai didi

java - 如何在每个线程完成 Java 运行后运行任务?

转载 作者:行者123 更新时间:2023-12-03 12:45:45 26 4
gpt4 key购买 nike

我有一个循环,它在每次迭代时创建一个新线程,如下所示:

for(int i = 0; i < REPEAT; i++) {
new Thread(new MyTask(i)).start();
Thread.sleep(1);
}

private void finalTask() {
//Some code to be executed once every threads stopped running
}

其中 MyTask 是一个实现 Runnable 的类。我的目标是:我想在每个线程停止后运行 finalTask​​。为实现这一点,我尝试在每次线程完成运行时将变量递增 1,一旦该变量等于 REPEAT,最终任务就会运行。但这没有用。我在 Google 和 StackOverlow 上搜索了我的问题的答案,但是关于这个的信息很少,而且没有一个能正常工作。在最终任务之后总会有一个线程在运行。那我该怎么做呢?

最佳答案

您可以使用 CountDownLatch为了这。一个 CountDownLatch 是

A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.

CountDownLatch countDownLatch = new CountDownLatch(REPEAT);
for (int i = 0; i < REPEAT; i++) {
new Thread(new MyTask(i, countDownLatch)).start();
Thread.sleep(1);
}
finalTask(countDownLatch);

我创建了一个 CountDownLatch,其 count 被初始化为 REPEAT 的值。我将其传递给每个线程和 finalTask​​ 方法。

每个线程完成其工作后都应调用 countDownLatch 的 countDown 方法。

private static class MyTask implements Runnable {

private int i;
private CountDownLatch countDownLatch;

private MyTask(int i, CountDownLatch countDownLatch) {
this.i = i;
this.countDownLatch = countDownLatch;
}

@Override
public void run() {
//Perform some task
System.out.println("Running " + i);
countDownLatch.countDown();
}
}

finalTask​​ 方法的第一行应该调用 CountDownLatch 的 await 方法。这将导致运行 finalTask​​ 的线程等待,直到 CountDownLatch 的计数达到 0,即,直到所有线程(它们的 REPEAT 数量)完成并调用 countDown CountDownLatch。

 private static void finalTask(CountDownLatch countDownLatch) {
try {
countDownLatch.await(); //this will wait until the count becomes 0.
} catch (InterruptedException e) {
e.printStackTrace(); //handle it appropriately
}
//Some code to be executed once all threads stopped running
System.out.println("All done");
}

关于java - 如何在每个线程完成 Java 运行后运行任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65859885/

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