异步任务-从Runnable到CompletableFuture

Java开发中多线程编程司空见惯,从开始的Thread、Runnable到Future再到CompletableFuture,JDK为我们使用多线程不断扩展功能。

Runnable/Thread

通常情况下的耗时操作会交给多线程来处理,Java中开启一个新线程很容易,继承自Thread或实现Runnable接口。下面是常规操作。

  • 开启多线程很多时候是为了利用CPU的多核能力。
  • 通常情况下我们只管一顿操作,开启线程扔出去,至于返回值我们开发中好像从来没管过。其实无论是new Thread()还是实现Runnable在执行完了都是无法获取执行结果的。大多情况下我们默认这个执行操作肯定会成功。出了问题也只能追日志了。

Callable

Callable是一个接口,一个函数式接口,也是个泛型接口。call()有返回值,且返回值类型与泛型参数类型相同,且可以抛出异常。Callable可以看作是Runnable接口的补充。

Future

Future是为了配合Callable/Runnable而产生的,既然有返回值,那么返回什么?什么时候返回?这些问题其实都可以算在Future机制里,我们可以通过future来对任务查询、取消、执行结果的获取,是调用方与异步执行方之间沟通的桥梁。

共同构成生产者-消费者模型:Callable生产结果,Future消费结果

FutureTask

到现在基本清晰了,Future机制就是为了解决多线程返回值的问题。但是Callable、Future、RunnableFuture都是接口,接口不干活啊。没关系,FutureTask来了。

同时实现了RunnableFuture接口,既可作为任务被线程执行,又能获取异步计算结果。

  • 异步结果获取

    • get()方法阻塞直到任务完成并返回结果
    • 提供超时控制版本:get(long timeout, TimeUnit unit)
  • 任务状态控制

    • 状态机设计(NEW→COMPLETING→NORMAL/EXCEPTIONAL/CANCELLED)
    • cancel()可中断运行中的任务57
    • isDone()检查任务终态(完成/取消/异常)
  • 线程安全保证

    • 通过volatile变量+CAS操作实现无锁同步
    • 确保Callable任务仅执行一次

CompleteFuture

CompletableFuture是Java 8引入的异步编程核心组件,堵塞获取结果的方式显然与异步编程相违背,timeout轮询的方式既不优雅也无法及时得到计算结果。

  • 同时实现FutureCompletionStage接口,既支持传统结果获取,又提供流式编程能力‌。
  • 支持通过supplyAsync/runAsync封装异步任务,默认使用ForkJoinPool.commonPool()执行‌
  • 聚合操作 ‌:allOf()等待所有任务完成,anyOf()获取最快完成的结果‌,runAfterBoth()2个CompletableFuture都完成之后,会执行一个Runnable等
  • 依赖操作 ‌:thenCompose()thenApplythenAccept实现任务串行化‌
  • 异常捕获‌ :提供exceptionally()/handle()等方法实现异步异常捕获‌

CompletableFuture大大扩展了Future能力,简化异步编程的复杂性。

详细使用见API文档

可参考:三个角度搞清CompletableFutureCompletableFuture使用详解(Super Detailed)

相关推荐
yangminlei11 小时前
Spring Boot3集成LiteFlow!轻松实现业务流程编排
java·spring boot·后端
计算机毕设VX:Fegn089512 小时前
计算机毕业设计|基于springboot + vue医院设备管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
J_liaty12 小时前
Spring Boot整合Nacos:从入门到精通
java·spring boot·后端·nacos
面汤放盐12 小时前
后端系统设计文档模板
后端
2***d88513 小时前
SpringBoot 集成 Activiti 7 工作流引擎
java·spring boot·后端
五阿哥永琪13 小时前
Spring中的定时任务怎么用?
java·后端·spring
追逐时光者13 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 65 期(2026年1.1-1.11)
后端·.net
计算机毕设VX:Fegn089513 小时前
计算机毕业设计|基于springboot + vue小型房屋租赁系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
gelald13 小时前
AQS 工具之 CountDownLatch 与 CyclicBarry 学习笔记
java·后端·源码阅读
且去填词13 小时前
Go 语言的“反叛”——为什么少即是多?
开发语言·后端·面试·go