在 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
}
};
与简单 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
}
};