本文将主要讲解 J.U.C 中的 Future 框架,并分析结合源码分析其内部结构逻辑;
一、Future 框架概述
JDK 中的 Future 框架实际就是 Future 模式的实现,通常情况下我们会配合线程池使用,但也可以单独使用;下面我们就单独使用简单举例;
- 应用实例
FutureTask future = new FutureTask<>(() -> {
log.info(“异步任务执行…”);
Thread.sleep(2000);
log.info(“过了很久很久…”);
return “异步任务完成”;
});
log.info(“启动异步任务…”);
new Thread(future).start();
log.info(“继续其他任务…”);
Thread.sleep(1000);
log.info(“获取异步任务结果:{}”, future.get());
打印:
[15:38:03,231 INFO ] [main] - 启动异步任务…
[15:38:03,231 INFO ] [main] - 继续其他任务…
[15:38:03,231 INFO ] [Thread-0] - 异步任务执行…
[15:38:05,232 INFO ] [Thread-0] - 过了很久很久…
[15:38:05,236 INFO ] [main] - 获取异步任务结果:异步任务完成
如上面代码所示,首先我们将要执行的任务包装成 Callable,这里如果不需要返回值也可以使用 Runnable;然后构建 FutureTask 由一个线程启动,最后使用 Future.get() 获取异步任务结果;
- Future 运行逻辑
对于 Future 模式的流程图如下:
对比上面的实例代码,大家可能会发现有些不一样,因为在 FutureTask 同时继承了 Runnable 和 Future 接口,所以再提交任务后没有返回Future,而是直接使用自身调用 get;下面我们就对源码进行实际分析;
二、源码分析
- FutureTask 主体结构
public interface RunnableFuture extends Runnable, Future {}
public class Fu