java - 确定 ExecutorCompletionService 队列中已完成任务的数量

标签 java multithreading

我正在开发一个项目,其中有大量数据元素输入需要处理。每个的处理都是独立于其他的,我需要每个的返回结果。我现在正在做的是为每个元素创建一个 Callable 任务来进行处理,并使用 ExecutorCompletionService 在线程完成时收集 Future 结果。

然后,我有另一个线程从 ExecutorCompletionService 队列中提取 Future 对象。该线程只是在无限 while 循环中旋转并调用 take() ,该循环会阻塞,直到 Future 出现在队列中。

我想要做的是避免出现这样的情况:Future 对象队列的增长速度比我将它们从队列中拉出的速度快,因此,如果我在处理 Future 结果方面落后,我想 hibernate 正在创建任务的进程。

我遇到的问题是,我无法找到一种方法来查看 ExecutorCompletionService 队列中有多少个 Future 对象。有办法做到这一点吗?

我可能可以保留一个外部计数器,在创建新任务时增加该计数器,在处理 Future 时减少该计数器,但这只能让我了解未完成任务的数量,而不是实际完成的任务数量。关于解决这个问题的最佳方法有什么想法吗?

最佳答案

您可以使用重载构造函数之一传递执行程序使用的队列。由于队列实现了 Collection,因此您可以在该队列上调用 .size() 。您将有一个用于完成的队列和另一个用于 ExecutorCompletionService 使用的执行程序的队列,这样您就可以知道这两个队列之间提交了多少个队列以及完成了多少个队列。

您只需在创建队列后保留这些队列并将其传递给正在监视其大小的任何人员即可。

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorCompletionService.html显示重载的构造函数

关于java - 确定 ExecutorCompletionService 队列中已完成任务的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19935857/

相关文章:

java - Spring JPA - "java.lang.IllegalArgumentException: Projection type must be an interface!"(使用 native 查询)

java - Alfresco通知邮件链接修改

java - 保留嵌套同步块(synchronized block)中的锁顺序

c++ - 可变数组 C++

c - 如何在 c 中为每个函数调用创建新线程

澄清 "region cannot be closely nested inside ' 并行'区域"

java - 如何获取用户在相关微调器上选择的数据?

java - 多线程——匹配实例

Java多态与运行时方法匹配

.net - 不可能(我讨厌使用这个词)交叉线程错误?