我正在研究多线程应用程序并使用ExecutorCompletionService来实现我的目的。到目前为止,应用程序运行良好,没有问题。但是有一个特定的场景 - 假设有n个线程正在运行,并且出于某种原因,某些线程稍后会完成处理,在这种情况下,如何确保程序使用所有处理线程生成的结果。我正在使用此类的 take()方法。但是,我试图了解是否有更好的方法。理想情况下,我正在寻找一种解决方案,通过它可以查询存储未完成任务的数据结构。因为我无法创建场景(可能需要时间,因为我需要进行某种一次性测试编码),在论坛中寻找建议。 的问候,
答案 0 :(得分:0)
如何确保程序使用所有处理线程生成的结果。
我假设您在询问ExecutorCompletionService
的消费者何时知道他们何时消耗了上一个任务?通常,您会计算提交到ExecutorService
的作业数量,然后在您将许多作业出列后停止从完成服务中获取。
如果您有大量无法一次排队的作业,您可以拥有一个计数器以及一个boolean done
状态字段。因此,当ExecutorCompletionService
为真并且作业计数器匹配时,done
将完成。
private class CompletedJobInfo {
ExecutorCompletionService service;
boolean done;
int submittedCount;
}