【问题标题】:What are the benefits of wrapping Callable/Runnable in a FutureTask?在 FutureTask 中包装 Callable/Runnable 有什么好处?
【发布时间】:2016-03-03 15:07:57
【问题描述】:

FutureTask 包装器为简单的 Callable/Runnables 提供了什么? 我见过一些人以这种方式使用期货,但我不确定它真正为游戏增加了什么。

Callable<Integer> myComputation = () -> {return 0;};
FutureTask<Integer> task = new FutureTask<Integer>(myComputation);

//Why this...       
Executors.newSingleThreadExecutor().execute(task);
task.get();

//...over the conventional approach?
Future<Integer> future = Executors.newSingleThreadExecutor().submit(myComputation);
future.get();

【问题讨论】:

标签: multithreading java-8 java.util.concurrent concurrent.futures


【解决方案1】:

我没有看到任何好处。公共接口的唯一区别是FutureTask 实现了RunnableFuture,除了Future 方法之外,还允许您通过RunnableFuture.run() 方法运行任务,但我怀疑您是否需要直接运行它。

直接使用FutureTask 类的主要目的是能够对其进行子类化,从而为done()setException() 等一些受保护的方法提供自定义实现。所以在下面的代码中是有意义的:

Callable<Integer> myComputation = () -> {return 0;};
FutureTask<Integer> task = new FutureTask<Integer>(myComputation) {
    @Override
    protected void done() {
        // some custom action on task completion
    }
};

【讨论】:

  • 当您只有 Executor 而不是 ExecutorService 时,需要手动包装。或者,如果您希望能够在实际操作中取消自己的任务。
猜你喜欢
  • 1970-01-01
  • 2013-08-20
  • 1970-01-01
  • 2011-04-04
  • 1970-01-01
  • 2019-10-12
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多