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

时间:2015-11-30 03:03:28

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

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

1 个答案:

答案 0 :(得分:2)

我认为没有任何好处。公共界面的唯一区别是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
    }
};