java - 执行器仍在运行时完成的任务数

标签 java multithreading executorservice executor

有什么方法可以找到调用invokeAll()后完成的任务数吗?当所有线程完成时,这似乎会返回已完成任务的 boolean 值列表。

我有一个包含 1000 个任务的池,希望以 100 个时间间隔查看它们,而不必将它们分成 100 个任务批处理。

出于兼容性原因,我还必须使用 Java 6,因此较新的方法将无济于事。

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

谢谢

最佳答案

I have a pool of 1000 tasks and want to take a look at them in 100 intervals without having to divide the them into 100-task batches.

您应该考虑使用 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);
}

does the invokeAll() processes the tasks in FIFO manner? That is, are the tasks get started with the order with which they are added to the task list?

任务以 FIFO 方式提交到线程池,并由线程也以 FIFO 顺序出列。然而,一旦每个线程都有一个工作,就会存在竞争条件,这可能会导致实际任务“开始”并肯定完成的一些重新排序。

关于java - 执行器仍在运行时完成的任务数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16200846/

相关文章:

java - 我需要处理 executorservice 中的异常吗

java - 当我们在方法内创建锁(同步块(synchronized block))对象时会发生什么?

java - androidPlot黑边

java - 在java中使用for循环时变量的范围 - eclipse/编译器错误?

java - 如何在restful Controller 的返回对象中设置成员变量

android - 为了在应用程序退出时终止工作线程,我们有什么钩子(Hook)

java - 如何使用 GSON 反序列化不同类型的数组

c++ - 使用 CPU 计时器控制线程进行两个单独的操作会导致性能下降吗?

c# - 为什么我在使用线程的并发 HTTP 连接上受限

java - 使用 ExecutorService 时,线程内的类是否安全?