gpt4 book ai didi

java - 多个执行器任务通知主节点已完成?

转载 作者:行者123 更新时间:2023-12-02 07:32:00 24 4
gpt4 key购买 nike

我正在使用 Java 执行器来并行划分和处理给定的任务。可以有任意数量的任务。它们都在开始时排队,主 Controller 对象只是等待它们全部完成。

我遇到的问题是如何确定所有任务何时完成。由于一个大型任务仅在同一时间排队(即所有当前排队的任务都属于同一个主任务),我可以使用 getCompletedTaskCount() 方法将已完成的任务数与已完成的任务数进行比较最初排队的任务数。

但是,这需要我不断轮询执行器以了解已完成的任务数量,在我看来这并不是一个很好的解决方案。

while (pool.getCompletedTaskCount() - start_count < num_tasks)
{
try
{
Thread.sleep(30);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}

我考虑过有一个计数器对象,每个任务都可以递增该计数器对象,然后如果计数等于预期任务的数量,则通知主线程。像这样的东西(忽略有些不完整的代码,例如缺少异常处理程序等):

主线程:

counter_object.expected_count = num_tasks;
counter_object.count = 0;
queue_tasks();
synchronized(counter_object)
{
counter_object.wait();
}
// all tasks have finished

worker 任务:

// ...do task
// task finished, update counter
synchronized(counter_object)
{
++counter_object.count;
if(counter_object.count == counter_object.expected_count)
{
// all tasks have finished, notify master thread
counter_object.notify();
}
}

此方法还有一个额外的好处,即我可以使用单个执行程序来运行多个主任务,因为计数器对象对于给定主任务来说是本地的。

有没有更好的方法来解决这个问题?任务的数量很可能大于执行器允许创建的最大线程数,所以我不认为 CyclicBarrier会起作用的。

最佳答案

这听起来像是 ExecutorService.invokeAll 的工作.

Collection<Callable> tasks = <get all sub tasks>;
executorService.invokeAll(tasks);
// Execution proceeds at the following line only once all "tasks" have been run

或者(因为您可能正在处理 Runnable 实例而不是 Callable,您可以使用 ExecutorService.submit(Runnable) 然后等待让他们完成。

for (Runnable task:tasks) {
futures.add(executorService.submit(task));
}

for (Future<Void> result:futures) {
result.get();
}

注意:省略异常处理

关于java - 多个执行器任务通知主节点已完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12791362/

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