当前位置: 首页 > news >正文

Java 并发任务模型

主要记录自己对Thread 、Callable、Runnable、Future、FutureTask、CompletableFuture的理解。

Thread 线程模型

java中Thread 的本质是一个执行单元,负责执行任务,可以看到Thread 的构造函数是这样的:

Thread(Runnable target)

他只能接收Runnable,不能接收Callable,我们知道启动一个线程就是调用Thread类的start方法,这个方法内部做了什么呢?

start()↓ 
创建线程 ↓ 
CPU 调度↓
执行 run() 方法run 方法本质 if (target != null) { target.run(); } 这说明Thread 只能执行 Runnable

对于Callable需要我们手动封装成FutureTask,FutureTask下文有介绍。

Runnable vs Callable

Runnable特点:无返回值、不能抛异常、可直接被 Thread / 线程池执行
Callable特点:有返回值、异常会被封装到返回值中、不能直接被Thread执行
我们常看到这样一句话,java中创建线程的方式有:继承Thread类、实现Runnable接口、实现Callable接口、使用线程池。其实这句话不太严谨,只有Thread类才是真正执行任务的线程,Callable和Runnable是任务的抽象,而线程池负责管理线程。

FutureTask

FutureTask实现了Future和Runnable接口,我们可以通过FutureTask对Callable任务封装,以便直接送入Thread中,除此之外,线程池内部也使用了FutureTask。在线程池场景中,我们通过submit提交任务的时候,内部就是通过FutureTask对任务进行封装的,封装之后我们才能获取任务执行结果、感知异常。
本质定义 FutureTask = Runnable + Future
核心作用
1.适配 Callable → Runnable Callable → FutureTask → Runnable
2.保存返回值 Callable 的结果、Runnable 的结果
3.保存异常 异常不会丢失 get() 时抛出
4.状态管理 task.isDone();

Future

本质 Future = 异步结果的抽象接口,通过submit提交任务会获得一个Future对象(FutureTask实现了Future接口)
核心能力 :
get() 获取结果(阻塞)
isDone() 判断是否完成
cancel() 取消任务
get() 抛出异常(ExecutionException)

CompletableFuture

本质 CompletableFuture = Future + CompletionStage
可以理解为升级版的Future,我们知道Future获取执行结果是阻塞的,completablefuture支持异步回调消费结果的。
核心能力

  1. 异步执行 CompletableFuture.supplyAsync(() -> "hello");
  2. 非阻塞回调 .thenApply(...) .thenAccept(...)
  3. 仍支持阻塞 cf.get();
  4. 编排能力(核心)
    🔹 串行 thenApply thenCompose
    🔹 并行 allOf anyOf
    🔹 条件 thenCompose + if/else
    🔹 异常处理 exceptionally handle
    🔹 结果消费 thenAccept thenRun
    🔹 超时控制 orTimeout completeOnTimeout

以上是个人浅显的理解,会不定时更新

http://www.jsqmd.com/news/651932/

相关文章:

  • 智库级深度复盘:商业航天星链协同测控云平台——从“单星孤岛”到“云网融合”的范式重构(WORD)
  • C#怎么使用TopLevel顶级语句 C#顶级语句怎么写如何省略Main方法简化控制台程序【语法】
  • 告别双系统!用VMware把Ubuntu 22.04装进移动固态硬盘,实现随身携带的开发环境
  • 【技术指南】解决anaconda-auth与pydantic_core版本冲突的实战方案
  • 【测试】GEO Writer 自动发布功能测试
  • 别让你的期刊论文,在审稿人手里“活不过”3分钟:好写作AI开启的学术进化论
  • 零基础教程:Windows系统快速搭建Minecraft私服并实现公网远程联机
  • PetaLinux 文件系统目录详解:嵌入式 Linux 根文件系统各文件夹的作用与内容
  • 移动端安全防护措施
  • PatchFlags 是什么?深入理解 Vue 3 编译器的动态标记优化
  • 【AI写作生产力跃迁临界点】:2026奇点大会首次披露的“认知对齐度”评估模型(附可落地的5维打分表)
  • 告别网盘限速困扰:LinkSwift插件如何让八大网盘文件下载速度提升10倍
  • 如何突破Cursor设备限制?机器ID重置终极方案详解
  • 2026年鸿蒙应用开发面试题深度解析:从原理到实战,一篇文章搞定HarmonyOS NEXT核心技术栈
  • ruoyi-vue 官网介绍和要点CSMD说明
  • 构建企业级智能问答系统的完整解决方案:MaxKB实战指南
  • 别再死记硬背AXI了!手把手教你用Vivado2020.2自定义IP核,让PL轻松读写PS的DDR内存
  • golang如何使用DTM分布式事务框架_golang DTM分布式事务框架使用方法
  • 项目上传github仓库(flutter)
  • 深度解析UUV Simulator:从水下动力学到多传感器融合的完整机器人仿真架构
  • 如何3分钟从视频中智能提取PPT:终极自动化工具指南
  • 40x40 矩阵控制系统
  • 告别龟速重构:用PyTorch实战LISTA,让你的压缩感知快人一步
  • ESP32与TB6612FNG实战:串口指令解析与直流电机闭环调速系统
  • SQL如何实现动态排名统计 掌握DENSE_RANK排序逻辑
  • 内容创作者利器:用HY-MT1.5-7B批量翻译多语言文章
  • 钉钉小程序开发避坑指南:从IDE配置到安全域名设置的完整流程
  • 告别单调图表!用C# DevExpress ChartControl打造酷炫数据看板(附甘特图、环形图实战代码)
  • 从“科研苦力”到“高效学者”:好写作AI的期刊论文功能,一次学术写作的“降维打击”
  • AI-Shoujo HF Patch高级配置指南:3步深度优化游戏体验