并发系列之 Future 框架详解

本文详细解析了Java并发编程中的Future框架,通过源码分析了FutureTask的内部结构和逻辑,包括任务的创建、执行、结果获取以及取消操作。文章还介绍了Future模式的应用实例,展示了如何创建和使用FutureTask,以及其与线程池的配合。通过对FutureTask的源码分析,揭示了其状态管理、无锁赋值和Treiber stack算法的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文将主要讲解 J.U.C 中的 Future 框架,并分析结合源码分析其内部结构逻辑;

一、Future 框架概述
JDK 中的 Future 框架实际就是 Future 模式的实现,通常情况下我们会配合线程池使用,但也可以单独使用;下面我们就单独使用简单举例;

  1. 应用实例
    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() 获取异步任务结果;

  1. Future 运行逻辑
    对于 Future 模式的流程图如下:

future

对比上面的实例代码,大家可能会发现有些不一样,因为在 FutureTask 同时继承了 Runnable 和 Future 接口,所以再提交任务后没有返回Future,而是直接使用自身调用 get;下面我们就对源码进行实际分析;

二、源码分析

  1. FutureTask 主体结构
    public interface RunnableFuture extends Runnable, Future {}

public class Fu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值