4

以下代码来自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?我在这里想念什么?

4

4 回答 4

6

a的要点RunnableFuture是:

  1. 它是Future
  2. 它是Runnable

它将Callable您已经拥有的东西转换为既是 aFuture又是 a 的东西Runnable。它涵盖了它打算涵盖的确切用例。如果您有 aCallable并且需要 a Future,则有FutureTask构造函数。

于 2012-07-11T08:45:41.517 回答
5

RunnableFuture代表一个特定的概念:一个未来的结果,其计算可以由工作线程通过调用显式执行run()

由于工作线程通常对它们执行的计算结果不感兴趣,因此它们使用run()不返回结果。对这些结果感兴趣的线程可以get()在工作线程完成计算后立即获取它们。

于 2012-07-11T08:34:40.347 回答
2

因为它是Runnable,即有一个public void run()方法,而不是Callable,它会有一个<T> public <T> run()方法。

于 2012-07-11T08:04:20.797 回答
0

也许很简单,因为 API 架构师从未被问过这个问题?

由于我们不知道我们只能问:有一个 newTaskFor(Runnable...) 方法,它返回一个 RunnableFuture,之所以这样调用,是因为它扩展了 Runnable 和 Future。

然后添加了一个 newTaskFor(Callable...) 方法 - 因为 Callable 也可以包装到实现 RunnableFuture 的 FutureTask 中,所以他们只是这样做而不是发明一个新接口只是为了清楚它将包装一个 Callable : 沿着奥卡姆剃刀原则使用最简单的可能解决方案,即已经存在的解决方案。

于 2012-07-11T08:47:30.097 回答