我正在开发一个需要处理大量数据元素的项目。每个处理都独立于其他处理,我需要返回每个处理的结果。我现在正在做的是为每个元素创建一个Callable
任务来进行处理,并在线程完成时使用ExecutorCompletionService
来收集Future
结果。
然后我有另一个线程从Future
队列中提取ExecutorCompletionService
个对象。这个线程只是在一个无限的while循环中旋转,并调用take()
阻塞,直到Future
出现在队列中。
我想要做的是避免Future
个对象的队列增长速度超过我从队列中拉出来的情况所以我想睡觉正在创建任务的过程如果我落后于处理Future
结果。
我遇到的问题是我无法找到Future
队列中有多少ExecutorCompletionService
个对象的方法。有没有办法做到这一点?
我可能会保留一个外部计数器,我在创建新任务时递增,并在处理Future
时递减但这只能让我获得未完成任务的数量,而不是实际完成的数量。有关解决这个问题的最佳方法的任何想法?
答案 0 :(得分:1)
您可以使用重载的构造函数之一传递执行程序使用的队列。由于队列实现了Collection,你只需要在该队列上调用.size()。您将有一个完成队列和ExecutorCompletionService使用的执行程序的另一个队列,这样您就可以知道提交了多少个以及在这两个之间完成了多少个。
你只需要在创建它们之后抓住这些队列并将其传递给任何正在观察其大小的队列。
http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorCompletionService.html显示重载的构造函数