使用Callable和FutureTask获取线程返回值原理分析
相关类:Callable、Future、Runnable、RunnableFuture和FutureTask
1、Callable接口
@FunctionalInterface public interface Callable<V> { V call() throws Exception; }
只有一个call方法并不具备注入到Thread类中的条件,Thread类只接受Runable接口类。
2、Future
可以理解为线程的管理类,有三方面的功能
1、能够取消异步执行的任务
2、判断异步任务是否执行完成
3、获取异步任务执行完成后的执行结果(重要)
3、RunnableFuture接口继承了Callable接口和Future接口
4、FutureTask实现RunnableFuture接口,将功能进行整合
三大属性(callable、outcome、state)+两大方法(run、get)
// 伪代码,只为理清思路 private Callable<T> callable; // 存储callable的返回结果 private Object outcome; // 线程的执行状态 private int state; // 依赖注入 public FutureTask(Callable callable) { this.callable = callable; } // 实现Runnable接口的方法 public void run() { T result = callable.call(); // 有个set函数 outcome = result; } // 返回callable的执行结果 public Object get() { if (state != complete) 一直阻塞,直到中断或者完成 return outcome; }