1

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

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

我正在尝试做的是避免对象队列增长速度快于我将它们从队列中拉出的情况,所以如果我在处理结果 Future时落后,我想休眠创建任务的进程。Future

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

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

4

1 回答 1

1

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

您只需要在创建它们后保留这些队列并将其传递给正在观察它们大小的任何人。

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

于 2013-11-19T07:12:00.920 回答