以下代码来自AbstractExecutorService:
/**
* Returns a <tt>RunnableFuture</tt> for the given callable task.
*
* @param callable the callable task being wrapped
* @return a <tt>RunnableFuture</tt> which when run will call the
* underlying callable and which, as a <tt>Future</tt>, will yield
* the callable's result as its result and provide for
* cancellation of the underlying task.
* @since 1.6
*/
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
return new FutureTask<T>(callable);
}
我无法理解为什么来自newTaskFor()
的返回对象的类将被称为RunnableFuture而不是CallableFuture?我在这里缺少什么?
答案 0 :(得分:4)
RunnableFuture
的要点是:
Future
Runnable
它会将您已有的Callable
转换为同时为Future
和Runnable
的内容。它涵盖了它打算涵盖的确切用例。如果您有Callable
且需要Future
,那么就是FutureTask
构造函数。
答案 1 :(得分:3)
RunnableFuture
表示一个特定的概念:未来的结果,其计算可以由工作线程通过调用run()
显式执行。
由于工作线程通常对它们执行的计算结果不感兴趣,因此它们使用不返回结果的run()
。一旦工作线程完成计算,对这些结果感兴趣的线程就可以从get()
获取它们。
答案 2 :(得分:2)
因为它是Runnable
,即具有public void run()
方法,而不是Callable
,它将采用<T> public <T> run()
方法。
答案 3 :(得分:0)
也许很简单,因为API架构师从未被问过这个问题?
因为我们不知道我们只能quess:有一个newTaskFor(Runnable ...)方法,它返回一个RunnableFuture,这个方法被调用,因为它扩展了Runnable和Future。
然后添加了一个newTaskFor(Callable ...)方法 - 因为Callable也可以包装到一个实现RunnableFuture的FutureTask中,他们只是做了它而不是发明一个新的接口只是为了清楚它会去使用最简单的可能解决方案,即已经存在的解决方案,沿着奥卡姆的剃刀原则包裹一个Callable: