首页 文章

多个执行程序任务通知master完成了?

提问于
浏览
0

我正在使用Java Actuator 来并行地划分和处理给定的任务 . 可以有任意数量的任务 . 它们都在开头排队,主控制器对象只是等待所有这些完成 .

我遇到的问题是如何确定所有任务何时完成 . 由于一个大任务只是一次排队(即所有当前排队的任务都属于同一个主任务),我可以使用 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不会起作用 .

1 回答

  • 2

    这听起来像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();
    }
    

    注意:省略了异常处理

相关问题