当前位置: 首页 > 知识库问答 >
问题:

执行者:等待特定任务完成

葛季萌
2023-03-14

我正在运行的服务器应用程序获取我要使用任务系统处理的多个任务请求。

每个任务都表示为一个可运行的线程池,该线程池中的线程数小于或等于线程池的大小,需要线程池中的线程数。当然,线程池是必要的,以避免CPU因线程过多而过载。

然而,其中一些任务可以是多线程的,而另一些则不能。这就是为什么一个任务可能需要等待其所有特定线程完成,以便合并这些线程的结果以获得最终结果的原因。

如果使用多个Thread实例,则可以像这样加入这些实例:

try {
    // Wait for all threads to finish their tasks
    for (Thread thread : threads) {
        thread.join();
    }
} catch (InterruptedException e) {
    e.printStackTrace();
}

// Finish job here ..

但是我需要这样的东西,使用java.util.concurrent.执行器或任何类似的线程池。

共有2个答案

巴洲
2023-03-14

如果我理解正确,你会需要这样的东西(但你的架构似乎太复杂了):

class MyTask implements Runnable {
    @Override
    public void run() {
        // some work
    }
}

之后:

ExecutorService executorService = Executors.newFixedThreadPool(2000);
ArrayList<Future> futures = new ArrayList<>();

futures.add(executorService.submit(new MyTask()));
futures.add(executorService.submit(new MyTask()));
futures.add(executorService.submit(new MyTask()));

for (Future future: futures) {
    try {
        future.get(100, TimeUnit.SECONDS); 
    } catch (Throwable cause) {
        // process cause
    }
}

每个future.get()将等待任务结束(本例中最长100秒)。

顾亦
2023-03-14

您可以为每个任务使用ExecutorService和CyclicBarrier,如下所示:

public class ThreadedTask implements Runnable {
    CyclicBarrier barrier;
    public ThreadedTask(CyclicBarrier barrier) {
        this.barrier = barrier;
    }
    @Override
    public void run() {
        // do something
        barrier.await();
    }
}
ExecutorService executor = Executors.newFixedThreadPool(pool_size);
...
CyclicBarrier barrier = new CyclicBarrier(n+1);
for(int i=0; i<n; i++) {
    // launch all tasks
    executor.submit(new ThreadedTask(barrier));
}
// waits for the tasks to finish or timeout
barrier.await(seconds, TimeUnit.SECONDS);
 类似资料:
  • 问题内容: 如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? 我正在使用Xcode 8.2并在Swift 3中编写。 问题答案: 使用s可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。

  • 我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!

  • 我的问题与这里的问题密切相关。正如在那里发布的,我希望主线程等到工作队列为空并且所有任务都完成。然而,我的问题是,每个任务都可能递归地导致新任务被提交处理。这使得收集所有这些任务的未来有点尴尬。 我们当前的解决方案使用忙等待循环来等待终止: numTasks是一个随着每个新任务的创建而增加的值。这很管用,但我觉得因为等待时间太长,所以不太好。我想知道是否有一种好方法可以让主线程同步等待,直到被显式

  • 我的makefile中的一个目标是一个非常耗时的CPU任务。但是我可以分割工作负载并并行运行任务几次,以加快整个过程。 我的问题是make不会等待所有过程完成。 考虑一下这个简单的脚本,名为“代码> MyTask.SH <代码>: 现在,让我们从bash脚本调用它,并使用等待所有任务完成: 产出如预期: 但是在Makefile中尝试相同的方法时: 它不起作用: 当然,我可以创建多个目标,这些目标可

  • 使用asyn/wait vs wait有什么区别task.run() 等待任务。运行示例- 异步等待示例-

  • 问题内容: 等待所有任务完成的最简单方法是什么?我的任务主要是计算,所以我只想运行大量的作业-每个内核上一个。现在,我的设置如下所示: 实现可运行。这似乎是正确执行的任务,但代码崩溃上用。这很奇怪,因为我玩了一些玩具示例,而且看起来很奏效。 包含数以万计的元素。我应该使用其他方法吗?我正在寻找尽可能简单的东西 问题答案: 最简单的方法是使用单行代码执行所需的操作。用你的话来说,你需要修改或包装以实