我试图找出ExecutorCompletionService类将结果排在Future<T>
而不是T
的原因。
根据its API take()
&#34;检索并移除代表下一个已完成任务的Future,等待(如果还没有)&#34;
因此,对future.get()
的调用永远不会阻止,因为该任务生成的产品已完成100%。
为什么要将该产品封装在Future
呢?
答案 0 :(得分:4)
嗯,有一件事,Future<T>
上返回的submit()
仍有一些可能与T
cancel()
不同,例如isDone()
,{{ 1}}以及get( long timeOut...)
等,所以虽然你可以说take()
可以返回T
,但也可以认为它更清晰,更灵活地返回而是Future<T>
。
特别是,它使被叫方有可能确定Callable
是否已完成或取消(这是TL; DR答案)
干杯,