我正在开发一个项目,其中有大量数据元素输入需要处理。每个的处理都是独立于其他的,我需要每个的返回结果。我现在正在做的是为每个元素创建一个 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/