Java 为什么这个类被称为RunnableFuture<;T>;而不是CallableFuture<;T>;?

Java 为什么这个类被称为RunnableFuture<;T>;而不是CallableFuture<;T>;?,java,java.util.concurrent,Java,Java.util.concurrent,以下代码来自: /** *返回给定可调用任务的RunnableFuture。 * *@param callable正在包装的可调用任务 *@返回一个RunnableFuture,运行时将调用 *潜在可赎回债券,作为未来债券,将产生 *可调用的结果作为其结果,并提供 *取消基础任务。 *@自1.6 */ 受保护的RunnableFuture newTaskFor(可调用可调用){ 返回新的FutureTask(可调用); } 我不明白为什么从newTaskFor()返回的对象的类会被称为Runn

以下代码来自:

/**
*返回给定可调用任务的RunnableFuture。
*
*@param callable正在包装的可调用任务
*@返回一个RunnableFuture,运行时将调用
*潜在可赎回债券,作为未来债券,将产生
*可调用的结果作为其结果,并提供
*取消基础任务。
*@自1.6
*/
受保护的RunnableFuture newTaskFor(可调用可调用){
返回新的FutureTask(可调用);
}

我不明白为什么从
newTaskFor()
返回的对象的类会被称为RunnableFuture而不是CallableFuture?这里我缺少了什么?

因为它是
可运行的
,也就是说,它有一个
公共void run()
方法,而不是
可调用的
,后者将有一个
公共run()
方法。

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


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

运行未来的点是:

  • 这是一个
    未来
  • 这是一个
    可运行的

  • 它将您已经拥有的
    可调用的
    转换为既是
    未来的
    又是
    可运行的
    。它涵盖了它打算涵盖的确切用例。如果您有一个
    可调用的
    并且需要一个
    未来
    ,那么就有
    未来任务
    构造函数。

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

    因为我们不知道,所以只能提问:有一个newTaskFor(Runnable…)方法,它返回一个RunnableFuture,之所以称为such,是因为它扩展了Runnable和Future


    然后添加了一个新的askfor(Callable…)方法-因为Callable也可以包装到一个实现RunnableFuture的FutureTask中,所以他们这样做,而不是发明一个新的接口,只是为了明确它将包装一个Callable:按照Occam的剃刀原理,使用最简单的解决方案,已经存在。

    调用()方法的签名是this
    V call()抛出异常。这个问题我的意思是说为什么他们没有设置
    V call()抛出异常方法并将其命名为CallableFuture,因为他们在这里所做的只是将一个
    可调用的
    包装到一个
    未来任务
    @Subhra中,然后我建议您相应地编辑您的问题。
     /**
     * 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);
     }