有没有办法找到调用invokeAll()后完成的任务数量?当所有线程都完成时,似乎返回已完成任务的布尔列表。
我有1000个任务池,想要在100个时间间隔内查看它们,而不必将它们分成100个任务批次。
出于兼容性原因,我也必须使用Java 6,因此更新的方法无法提供帮助。
另外,作为一个附带问题:invokeAll()是否以FIFO方式处理任务?也就是说,任务是否以它们被添加到任务列表的顺序开始?
由于
答案 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>
,您可以定期轮询以查看完成了多少。