FutureTask
创建FutureTask可用于接收线程的运行结果。一般Runable的接口里的抽象方法run是void型的,我们如果想要拿到某个线程的执行结果来用,显然重写 run() 方法里是不容易办到的。我们就可以创建 FutureTask 传入Callable接口的实现类,在实现类中重写 T call() 方法,执行任务逻辑,等到我们需要线程的执行结果时,调用get方法就可以了
FutureTask 可用于异步获取执行结果或取消执行任务的场景。通过传入 Runnable 或者Callable的任务给FutureTask,直接调用其run方法或者放入线程池执行,之后可以在外部通过 FutureTask 的 get 方法异步获取执行结果,因此,FutureTask 非常适合用于耗时的计算,主线程可以在完成自己的任务后,再去获取结果。另外,FutureTask 还可以确保即使调用了多次 run 方法,它都只会执行一次 Runnable 或者 Callable 任务,或者通过 cancel 取消 FutureTask 的执行等。
@org.junit.Test
public void Test( ) {
// 创建FutureTask用来接收线程运行的结果
FutureTask<Integer> threadResult = new FutureTask<Integer>(new Callable<Integer>() {
int count = 0;
@Override
public Integer call() throws Exception {
// 执行一系列任务逻辑
count++;
return count;
}
});
// 开启线程
new Thread(threadResult).start();
try {
// 拿到线程的执行结果
Integer result = threadResult.get();
System.err.println(result);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}