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

Java并发编程之CompletableFuture原理与实践

一、前言

在Java并发编程中,CompletableFuture是一个强大而灵活的工具。今天,我们将深入探讨它的实现原理、最佳实践,以及面试中的重要考点。

二、CompletableFuture的本质

CompletableFuture是Java 8引入的异步编程工具,它实现了Future和CompletionStage两个接口。这个设计让它既保持了Future的基本特性,又通过CompletionStage接口提供了强大的任务编排能力。

让我们先看一个基本示例:

public class CompletableFutureBasics {public static void main(String[] args) {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 模拟耗时操作sleep(1000);return "Hello";}).thenApply(result -> {// 转换结果return result + " World";});// 非阻塞方式处理结果future.thenAccept(System.out::println);}
}

三、核心方法

3.1 实例方法

public class Completable01 {public static void main(String[] args) throws Exception {// 线程池ExecutorService executor = Executors.newFixedThreadPool(3);// 1、创建未完成的CompletableFuture,通过complete()方法完成CompletableFuture<Integer> cft01 = new CompletableFuture<>() ;cft01.complete(99) ;// 2、创建已经完成CompletableFuture,并且给定结果CompletableFuture<String> cft02 = CompletableFuture.completedFuture("given...value");// 3、有返回值,默认ForkJoinPool线程池CompletableFuture<String> cft03 = CompletableFuture.supplyAsync(() -> {return "OK-3";});// 4、有返回值,采用Executor自定义线程池CompletableFuture<String> cft04 = CompletableFuture.supplyAsync(() -> {return "OK-4";},executor);// 5、无返回值,默认ForkJoinPool线程池CompletableFuture<Void> cft05 = CompletableFuture.runAsync(() -> {});// 6、无返回值,采用Executor自定义线程池CompletableFuture<Void> cft06 = CompletableFuture.runAsync(()-> {}, executor);}
}

3.2 计算方法

public class Completable02 {public static void main(String[] args) throws Exception {// 线程池ExecutorService executor = Executors.newFixedThreadPool(3);CompletableFuture<String> cft01 = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "OK";},executor);// 1、计算完成后,执行后续处理// cft01.whenComplete((res, ex) -> System.out.println("Result:"+res+";Exe:"+ex));// 2、触发计算,如果没有完成,则get设定的值,如果已完成,则get任务返回值// boolean completeFlag = cft01.complete("given...value");// if (completeFlag){//     System.out.println(cft01.get());// } else {//     System.out.println(cft01.get());// }// 3、开启新CompletionStage,重新获取线程执行任务cft01.whenCompleteAsync((res, ex) -> System.out.println("Result:"+res+";Exe:"+ex),executor);}
}

3.3 获取结果方法

public class Completable03 {public static void main(String[] args) throws Exception {// 线程池ExecutorService executor = Executors.newFixedThreadPool(3);CompletableFuture<String> cft01 = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}return "Res...OK";},executor);// 1、阻塞直到获取结果// System.out.println(cft01.get());// 2、设定超时的阻塞获取结果// System.out.println(cft01.get(4, TimeUnit.SECONDS));// 3、非阻塞获取结果,如果任务已经完成,则返回结果,如果任务未完成,返回给定的值// System.out.println(cft01.getNow("given...value"));// 4、get获取抛检查异常,join获取非检查异常System.out.println(cft01.join());}
}

3.4 任务编排方法

public class Completable04 {public static void main(String[] args) throws Exception {// 线程池ExecutorService executor = Executors.newFixedThreadPool(3);CompletableFuture<String> cft01 = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("OK-1");return "OK";},executor);// 1、cft01任务执行完成后,执行之后的任务,此处不关注cft01的结果// cft01.thenRun(() -> System.out.println("task...run")) ;// 2、cft01任务执行完成后,执行之后的任务,可以获取cft01的结果// cft01.thenAccept((res) -> {//     System.out.println("cft01:"+res);//     System.out.print

相关文章:

  • 杭电oj(1087、1203、1003)题解
  • 什么是CAN的非破坏仲裁?
  • Java基础(包装器,关键字,修饰符,Object)
  • 实验2 python的TCP群聊系统实现
  • Java基础:认识注解,模拟junit框架
  • 3dmax模型怎么导入酷家乐插件,材质贴图在,可优化不卡,可批量处理,无需打开一个个max,可批量转FBX/GLB/GLTF/OBJ/SU
  • 查询Hologres或postgresql中的数据
  • 即插即用模块(3) -LSK 特征提取
  • Spring--统一数据返回格式与统一异常处理
  • 将 MySQL 8 主从复制延迟优化到极致
  • 如何在iStoreOS DHCP中排除特定IP地址
  • zkPass案例实战之合约篇
  • 【论文#目标检测】Attention Is All You Need
  • 【泊松过程和指数分布】
  • 力扣DAY63-67 | 热100 | 二分:搜索插入位置、搜索二维矩阵、排序数组查找元素、搜索旋转排序数组、搜索最小值
  • OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像
  • 计算机视觉基础
  • 提高Spring Boot开发效率的实践
  • MsQuick编译和使用
  • c++概念——模板的进阶讲解
  • 中央党校(国家行政学院)举行2025年春季学期第一批进修班毕业典礼
  • 上海国际咖啡文化节开幕,北外滩集结了超350个展位
  • 结婚这件事,年轻人到底怎么想的?
  • 招商蛇口:一季度营收约204亿元,净利润约4.45亿元
  • 国泰海通合并后首份业绩报告出炉:一季度净利润增逾391%
  • 量子传感新技术“攻克”退相干难题