执行程序仍在运行时完成的任务数

时间:2013-04-24 19:45:16

标签: java multithreading executorservice executor

有没有办法找到调用invokeAll()后完成的任务数量?当所有线程都完成时,似乎返回已完成任务的布尔列表。

我有1000个任务池,想要在100个时间间隔内查看它们,而不必将它们分成100个任务批次。

出于兼容性原因,我也必须使用Java 6,因此更新的方法无法提供帮助。

另外,作为一个附带问题:invokeAll()是否以FIFO方式处理任务?也就是说,任务是否以它们被添加到任务列表的顺序开始?

由于

2 个答案:

答案 0 :(得分:3)

  

我有1000个任务池,想要在100个时间间隔内查看它们,而不必将它们分成100个任务批次。

您应该考虑使用ExecutorCompletionService,它允许您在单个作业完成后收到通知,而不必等待所有作业使用invokeAll()完成。然后,您可以将每个已完成的作业放入一个集合中,然后在达到100时对其执行操作。

可能是这样的:

CompletionService<Result> ecs = new ExecutorCompletionService<Result>(executor);
for (Callable<Result> s : solvers)
    ecs.submit(s);
int n = solvers.size();
List<Result> batch = new ArrayList<Result>();
for (int i = 0; i < n; ++i) {
    Result r = ecs.take().get();
    batch.add(r);
    if (batch.size() >= 100) {
       process(batch);
       batch.clear();
    }
}
if (!batch.isEmpty()) {
    process(batch);
}
  

invokeAll()是否以FIFO方式处理任务?也就是说,任务是否以它们被添加到任务列表的顺序开始?

任务以FIFO方式提交给线程池,并且线程也按FIFO顺序排队。但是,一旦每个线程都有一个作业,就会出现竞争条件,这可能会导致实际任务“重新开始”重新排序,并且肯定会完成。

答案 1 :(得分:0)

任务将按您指定的顺序添加,如果您有多个线程,则大致以该顺序启动。如果他们花费相同的时间,他们完成的顺序将大致按顺序排列。

我会构建一个List<Future>,您可以定期轮询以查看完成了多少。