ExecutorCompletionService的疑问

java.util.concurrent中的ExecutorCompletionService,其实现的是CompletionService接口。

我对ExecutorCompletionService存在一个疑问,在其实现中,task是被执行之后,才把futureTask加入到completionQueue,既然如此,不如直接把Result加入到completionQueue中了。这个行为没什么差别的。对这个类的设计存在一些怀疑,我认为其task方法,似乎返回值是V更合适。

原来是这样的:
Future<V> take() throws InterruptedException;
Future
<V> poll();


觉得也许应该改称这样:
V take() throws InterruptedException;
V poll();

posted on 2006-11-13 20:11 温少 阅读(1044) 评论(1) 编辑 收藏

评论

#1楼[楼主]  回复 引用 查看   

使用Future<V>作返回值似乎能够提供更多的功能。

在ExecutorCompletionService的实现中,使用一个Executor,一个BlockingQueue<Future<V>>。
当Submit的时候,转化为一个内嵌类class QueueingFuture extends FutureTask<Void>。
当executor执行task结束后,会调用QueueingFuture的done方法,把Result加入到completionQueue中。
至于为什么使用BlockingQueue<Future<V>>作为completionQueue,而不使用BlockingQueue<V>,是因为executor执行task时,可能出错,这是使用Future就有意义了。
可以获得执行出错信息,future.get()会抛出ExecutionException。
2006-11-13 20:40 | 温少