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

杭州网站建站商城网站都有什么功能

杭州网站建站,商城网站都有什么功能,泉州建行 网站,郴州网站建设哪家做的好文章目录一、CompletableFuture 的核心优势二、基本使用方式1. 创建 CompletableFuture 实例(1)异步执行 Runnable 任务(无返回值)(2)异步执行 Supplier 任务(有返回值)(…

文章目录

      • 一、`CompletableFuture` 的核心优势
      • 二、基本使用方式
        • 1. 创建 `CompletableFuture` 实例
          • (1)异步执行 Runnable 任务(无返回值)
          • (2)异步执行 Supplier 任务(有返回值)
          • (3)指定自定义线程池
        • 2. 链式操作(任务完成后的后续处理)
          • (1)`thenApply()`:转换结果(有返回值)
          • (2)`thenAccept()`:消费结果(无返回值)
          • (3)`thenRun()`:任务完成后执行(不关心结果)
          • (4)异步链式操作(`thenApplyAsync()` 等)
        • 3. 异常处理
          • (1)`exceptionally()`:捕获异常并返回默认值
          • (2)`handle()`:同时处理正常结果和异常
        • 4. 多任务组合
          • (1)`allOf()`:等待所有任务完成
          • (2)`anyOf()`:等待任一任务完成
      • 三、典型应用场景
      • 总结

CompletableFuture 是 Java 8 引入的异步编程工具类,基于 java.util.concurrent 包,它在 Future 基础上增强了异步任务的编排能力,支持链式调用、异常处理、多任务组合等复杂操作,是实现非阻塞异步编程的核心工具。

一、CompletableFuture 的核心优势

相比传统的 FutureCompletableFuture 具有以下特点:

  1. 异步执行:支持异步提交任务,无需阻塞等待结果。
  2. 链式操作:任务完成后可自动触发后续操作(如转换结果、组合任务)。
  3. 异常处理:提供专门的异常处理方法,避免传统 Future.get() 必须捕获 Exception 的繁琐。
  4. 多任务协作:支持多个异步任务的并行、串行或条件组合(如“所有任务完成”“任一任务完成”)。

二、基本使用方式

1. 创建 CompletableFuture 实例
(1)异步执行 Runnable 任务(无返回值)
// 使用默认线程池(ForkJoinPool.commonPool())异步执行任务
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {System.out.println("异步执行无返回值任务,线程:" + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}
});// 阻塞等待任务完成(实际开发中应避免阻塞,改用回调)
future.join(); // 类似 get(),但抛出 unchecked 异常
(2)异步执行 Supplier 任务(有返回值)
// 异步执行有返回值的任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {System.out.println("异步执行有返回值任务,线程:" + Thread.currentThread().getName());try {Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}return "任务结果";
});// 获取结果(非阻塞方式见后续链式操作)
String result = future.get(); // 阻塞获取,需处理异常
System.out.println("结果:" + result);
(3)指定自定义线程池

默认使用 ForkJoinPool.commonPool(),可传入自定义线程池避免资源竞争:

ExecutorService executor = Executors.newFixedThreadPool(3);
// 使用自定义线程池执行任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 任务逻辑return "结果";
}, executor);
2. 链式操作(任务完成后的后续处理)

CompletableFuture 提供了一系列以 then 开头的方法,用于在当前任务完成后自动执行后续操作。

(1)thenApply():转换结果(有返回值)

对前一个任务的结果进行处理并返回新结果:

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello")// 前一个任务完成后,将结果转换为 "Hello World".thenApply(str -> str + " World");System.out.println(future.join()); // 输出:Hello World
(2)thenAccept():消费结果(无返回值)

接收前一个任务的结果并处理,无返回值:

CompletableFuture.supplyAsync(() -> "Hello").thenAccept(str -> System.out.println("处理结果:" + str)); // 输出:处理结果:Hello
(3)thenRun():任务完成后执行(不关心结果)

前一个任务完成后,执行新的 Runnable 任务,不依赖前序结果:

CompletableFuture.supplyAsync(() -> {// 耗时任务return "结果";
}).thenRun(() -> System.out.println("前序任务已完成"));
(4)异步链式操作(thenApplyAsync() 等)

默认情况下,链式操作与前序任务在同一线程执行。使用 xxxAsync() 可让后续任务在异步线程池执行:

CompletableFuture.supplyAsync(() -> {System.out.println("第一个任务线程:" + Thread.currentThread().getName());return "Hello";
}).thenApplyAsync(str -> { // 异步执行后续操作System.out.println("第二个任务线程:" + Thread.currentThread().getName());return str + " World";
}).thenAcceptAsync(result -> { // 再次异步执行System.out.println("第三个任务线程:" + Thread.currentThread().getName());System.out.println(result);
});
3. 异常处理

CompletableFuture 提供了专门的异常处理方法,避免繁琐的 try-catch

(1)exceptionally():捕获异常并返回默认值
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {if (true) {throw new RuntimeException("任务执行失败");}return 100;
}).exceptionally(ex -> { // 捕获异常,返回默认值System.out.println("捕获异常:" + ex.getMessage());return 0; // 异常时返回0
});System.out.println(future.join()); // 输出:0
(2)handle():同时处理正常结果和异常

无论前序任务成功或失败,都会执行,可根据状态处理:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 10 / 0) // 会抛出异常.handle((result, ex) -> {if (ex != null) {System.out.println("异常:" + ex.getMessage());return -1; // 异常时返回-1} else {return result * 2; // 正常时翻倍}});System.out.println(future.join()); // 输出:-1
4. 多任务组合

支持多个 CompletableFuture 的协同操作,如等待所有任务完成或任一任务完成。

(1)allOf():等待所有任务完成

当所有任务都完成后,才执行后续操作(无返回值,需单独获取每个任务结果):

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "任务1");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "任务2");
CompletableFuture<String> future3 = CompletableFuture.supplyAsync(() -> "任务3");// 等待所有任务完成
CompletableFuture<Void> allFuture = CompletableFuture.allOf(future1, future2, future3);// 所有任务完成后执行
allFuture.thenRun(() -> {String result1 = future1.join();String result2 = future2.join();String result3 = future3.join();System.out.println("所有任务完成:" + result1 + "," + result2 + "," + result3);
});
(2)anyOf():等待任一任务完成

只要有一个任务完成,就执行后续操作(返回第一个完成的任务结果):

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {try { Thread.sleep(300); } catch (InterruptedException e) {}return "任务1";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {try { Thread.sleep(100); } catch (InterruptedException e) {}return "任务2"; // 最先完成
});// 等待任一任务完成
CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(future1, future2);anyFuture.thenAccept(result -> {System.out.println("第一个完成的任务结果:" + result); // 输出:任务2
});

三、典型应用场景

  1. 异步接口调用:如微服务中并行调用多个接口,汇总结果后返回。
  2. 耗时任务并行处理:如批量数据处理,将任务拆分后并行执行,提高效率。
  3. 非阻塞IO操作:如文件读写、网络请求等IO密集型任务,避免线程阻塞。

总结

CompletableFuture 是 Java 异步编程的核心工具,通过以下特性简化异步逻辑:

  • runAsync()/supplyAsync() 提交异步任务;
  • thenApply()/thenAccept() 实现链式操作;
  • exceptionally()/handle() 处理异常;
  • allOf()/anyOf() 组合多任务。

它避免了传统 Future 的阻塞问题,让异步代码更简洁、易维护,尤其适合高并发场景下的任务编排。

http://www.dtcms.com/a/511907.html

相关文章:

  • 南宁企业网站设计陕西建设厅网站首页
  • 高频疲劳试验机主要技术规格
  • C++内存管理的理解
  • 当EtherCAT遇上PROFINET:我们的“协议小翻译”让矿井安全手拉手
  • 【完整源码+数据集+部署教程】【制造业&盒子】食品物品检测系统源码&数据集全套:改进yolo11-MultiSEAMHead
  • 在windows学习Kubernetes的几个障碍
  • MySQL数据库管理、DDL、DQL、DML、DCL等总结
  • Telink BLE SDK软件架构
  • 计算机毕设java医院挂号系统 基于Java的医院智能挂号与信息管理系统 Java医院挂号及医疗信息综合平台
  • 上海市500强企业名单单页面优化
  • 【0443】signalfd + epoll 完成事件监听+指定信号处理(演示demo)
  • 湛江有没有做网站的算卦网站哪里可以做
  • 布局具身智能时代(上):深兰科技“具身视觉导航大脑”技术的商业化探索
  • test002
  • RTPENGINE redis 测试
  • 在Ubuntu中安装Docker
  • 佛山市专注网站建设平台网站制作二级网页怎么做
  • 百度收录情况查询南通seo公司网站
  • 【MySQL】慢查寻的发现和解决优化(思维导图版)
  • gbase8s之.net8连接8s之mysql模式(windows)demo
  • 【AI】大模型之深度估计
  • 7.1 EXTI工作原理
  • LazyLLM教程 | 第11讲:性能优化指南:从冷启动到响应加速你的RAG
  • windows后渗透中常用的信息收集命令
  • 初始化node项目express,项目结构介绍
  • Optuna - 自动调参利器python实例
  • 新网站做优化要准备什么合肥网站建设哪个公司做得比较好
  • 提供服务好的网站制作网站怎么做会员系统
  • 绍兴网站建设推广宁夏建设管理局网站
  • 【面向小白】git rebase全面总结,什么时候用rebase