在 FutureTask 中包装 Callable/Runnable 有什么好处?

What are the benefits of wrapping Callable/Runnable in a FutureTask?

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

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();

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

直接使用 FutureTask class 的主要目的是能够子 class 它为某些受保护的方法提供自定义实现,例如 done()setException().所以它在下面的代码中是有意义的:

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