当前位置: 首页 > 面试题库 >

Java中的Future和FutureTask有什么区别?

司空俊雄
2023-03-14
问题内容

既然使用一个任务ExecutorService可以返回一个,为什么需要使用包装任务和使用方法?我觉得他们都做同样的事情。submit``Callable``Future``FutureTask``Callable``execute


问题答案:

其实你是对的。两种方法是相同的。通常,您不需要自己包装它们。如果是这样,您可能会在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);
}

Future和RunnableFuture之间的唯一区别是run()方法:

/**
 * A {@link Future} that is {@link Runnable}. Successful execution of
 * the <tt>run</tt> method causes completion of the <tt>Future</tt>
 * and allows access to its results.
 * @see FutureTask
 * @see Executor
 * @since 1.6
 * @author Doug Lea
 * @param <V> The result type returned by this Future's <tt>get</tt> method
 */
public interface RunnableFuture<V> extends Runnable, Future<V> {
    /**
     * Sets this Future to the result of its computation
     * unless it has been cancelled.
     */
    void run();
}

让执行者为您构造FutureTask的一个很好的理由是,确保对FutureTask实例的引用不止一种。也就是说,执行者 拥有 这个实例。



 类似资料:
  • 问题内容: Scala Future和Java Future之间在概念,功能或机械方面是否存在差异?从概念上讲,我看不到任何差异,因为它们都旨在提供异步计算机制。 问题答案: 主要的不便之处在于,如果没有阻塞,就无法获得价值。 实际上,检索值的唯一方法是方法,即方法(引用docs) 等待必要的计算完成,然后检索其结果。 有了你,而不是一个真正的无阻塞的计算,因为你可以将回调完成(成功/失败),或简

  • 问题内容: Deferred,Promise和Future之间有什么区别? 这三者之间是否有公认的理论? 问题答案: 考虑到我对尝试回答OP的问题的明显不满。字面上的答案是,诺言是与其他对象共享的东西,而延期则应保持私有。首先,延期(通常扩展为Promise)可以解决自己,而Promise可能无法解决。 如果您对细节有兴趣,请检查Promises / A +。 据我所知,总体目的是提高清晰度,并通

  • 本文向大家介绍javascript中的Deferred,Promises和Future之间有什么区别?,包括了javascript中的Deferred,Promises和Future之间有什么区别?的使用技巧和注意事项,需要的朋友参考一下 未来是一个与承诺相同的旧名词。 一个承诺代表了一个未知的价值。这可以更好地理解为创建诺言时不一定知道的值的代理。 递延代表尚未完成的工作。延期(通常扩展为Pro

  • Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别。 Runnable 其中Runnable应该是我们最熟悉的接口,它只有一个run()函数,用于将耗时操作写在其中,该函数没有返回值。然后使用某个线程去执行该runnable即可实现多线程,Thread

  • 问题内容: 我一直认为Java 中的运算符用于验证其两个布尔操作数是否均为,并且该&运算符用于对两种整数类型进行按位运算。 最近我知道,也可以使用运算符来验证其两个布尔操作数是否均为,唯一的区别是即使LHS操作数为false,它也会检查RHS操作数。 Java中的运算符是否在内部重载?还是在这背后有其他概念? 问题答案: <-验证两个操作数 <-停止评估第一个操作数是否为false,因为结果为fa

  • 原文链接:Mr.Simple,http://blog.csdn.net/bboyfeiyu/article/details/24851847 Java中存在Runnable、Callable、Future、FutureTask这几个与线程相关的类或者接口,在Java中也是比较重要的几个概念,我们通过下面的简单示例来了解一下它们的作用于区别。 Runnable 其中Runnable应该是我们最熟悉的