【线程】FutureTask vs. CompletableFuture:解锁异步编程的不同层次(1)

在Java的多线程编程中,FutureTaskCompletableFuture 是两个关键的工具,分别代表了基础和进阶的异步编程技术。本文将深入介绍这两者的特点、使用方法以及它们之间的巧妙应用、区别以及各自的优缺点。

1. FutureTask:基础异步任务的引路者

1.1 什么是 FutureTask?

FutureTask 是一个实现了 Future 接口的可取消异步计算任务。它简化了异步任务的处理,能够方便地执行和获取结果。

1.2 使用示例
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;class MyCallable implements Callable<String> {public String call() throws Exception {// 执行耗时操作return "Task completed!";}
}public class FutureTaskExample {public static void main(String[] args) {FutureTask<String> futureTask = new FutureTask<>(new MyCallable());new Thread(futureTask).start();try {String result = futureTask.get();System.out.println(result);} catch (Exception e) {e.printStackTrace();}}
}

2. CompletableFuture:更灵活的异步编程

2.1 什么是 CompletableFuture?

CompletableFuture 是Java 8引入的强大异步编程工具。它支持链式调用、多个异步任务组合、异常处理等特性,使得异步编程更为灵活。

2.2 使用示例
import java.util.concurrent.CompletableFuture;public class CompletableFutureExample {public static void main(String[] args) {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 执行耗时操作return "Task completed!";});future.thenAccept(result -> System.out.println(result));try {future.get();} catch (Exception e) {e.printStackTrace();}}
}

另外这CompletableFuture 是一个功能强大的类,提供了丰富的方法来支持异步编程的各种需求。除了上文提到的 supplyAsyncthenAccept,下面是一些 CompletableFuture 中常用的方法:

1. thenApply()

thenApply 方法用于对 CompletableFuture 的结果进行转换。它接受一个 Function 参数,该函数会在异步任务完成后被应用于结果,并返回一个新的 CompletableFuture,其中包含转换后的结果。

CompletableFuture<String> originalFuture = CompletableFuture.supplyAsync(() -> "Hello");CompletableFuture<Integer> transformedFuture = originalFuture.thenApply(s -> s.length());
2. thenCompose()

thenCompose 方法用于连接两个异步任务,将它们的结果合并成一个新的 CompletableFuture。它接受一个 Function 参数,该函数返回一个新的 CompletableFuture

CompletableFuture<String> firstFuture = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> secondFuture = CompletableFuture.supplyAsync(() -> " World");CompletableFuture<String> combinedFuture = firstFuture.thenCompose(s -> secondFuture.thenApply(t -> s + t));
3. thenCombine()

thenCombine 方法用于组合两个独立的 CompletableFuture 的结果。它接受两个参数:第一个是另一个 CompletableFuture,第二个是一个 BiFunction,用于合并两个结果。

CompletableFuture<String> firstFuture = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> secondFuture = CompletableFuture.supplyAsync(() -> " World");CompletableFuture<String> combinedFuture = firstFuture.thenCombine(secondFuture, (s, t) -> s + t);
4. exceptionally()

exceptionally 方法用于处理异常情况。它接受一个 Function 参数,该函数在异步任务发生异常时被执行,返回一个替代值或者另一个异步任务。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 模拟异常throw new RuntimeException("Error");
});CompletableFuture<String> result = future.exceptionally(ex -> "Handled Exception");
5. handle()

handle 方法类似于 exceptionally,但它能处理正常结果和异常。它接受一个 BiFunction 参数,该函数在异步任务完成时被执行,可以处理正常结果或异常。

CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello");CompletableFuture<String> result = future.handle((res, ex) -> {if (ex != null) {return "Handled Exception";} else {return res.toUpperCase();}
});
6. allOf() 和 anyOf()

allOf 方法接受一个 CompletableFuture 数组,返回一个新的 CompletableFuture,当数组中的所有任务都完成时,新的 CompletableFuture 才会完成。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");CompletableFuture<Void> allOfFuture = CompletableFuture.allOf(future1, future2);

anyOf 方法也接受一个 CompletableFuture 数组,但返回的 CompletableFuture 在数组中的任意一个任务完成时就会完成。

CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");CompletableFuture<Object> anyOfFuture = CompletableFuture.anyOf(future1, future2);

以上只是 CompletableFuture 中一部分常用方法,它还提供了更多用于处理超时、取消任务等功能的方法。使用这些方法,你可以更灵活地处理异步编程中的各种情况,提高代码的可读性和可维护性。

3. 巧妙应用和区别

3.1 巧妙应用
  • FutureTask 应用场景: 适用于简单的异步任务执行,比如在使用 ExecutorService 进行线程池管理时。
  • CompletableFuture 应用场景: 适用于复杂的异步编程需求,特别是需要组合多个异步任务的场景,例如进行并行操作、串联操作等。
3.2 区别
  • 异步任务组合: FutureTask 不直接支持多个异步任务的组合,而 CompletableFuture 提供了一系列方法,如 thenComposethenCombine 等,支持多个异步任务的组合和协同执行。
  • 异常处理: CompletableFuture 更灵活地支持异常处理,能够通过 exceptionallyhandle 方法处理异步任务中的异常,而 FutureTask 的异常处理相对简单。

4. 优缺点比较

4.1 FutureTask 优缺点:
  • 优点:
    • 简单易用,适合基础的异步任务执行。
    • 相对轻量,不引入过多复杂性。
  • 缺点:
    • 不支持多个异步任务的组合,无法方便地进行并发操作。
4.2 CompletableFuture 优缺点:
  • 优点:
    • 强大的异步编程特性,支持多个异步任务的组合和协同执行。
    • 丰富的异常处理机制,使得错误处理更加灵活。
  • 缺点:
    • 学习曲线较陡,相对于简单的异步任务,使用起来可能更复杂。

5. 总结与展望

FutureTaskCompletableFuture 分别代表了Java异步编程的两个不同层次。选择使用哪个取决于项目需求的复杂度和对异步编程功能的需求。在实际应用中,你可能会根据具体场景选择灵活的 CompletableFuture 或者简单的 FutureTask,以提高代码的可读性和维护性。希望通过深入了解这两者,你能够在异步编程的领域中更得心应手。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AR特效自研AI算法技术解决方案

在当今这个高速发展的数字化时代&#xff0c;增强现实&#xff08;AR&#xff09;技术已经成为企业创新和市场竞争的重要手段。美摄科技凭借对AI技术的深厚积累&#xff0c;为企业提供了一套创新的AR特效自研AI算法技术解决方案&#xff0c;旨在满足企业在AR领域的多元化需求。…

选择大语言模型:2024 年开源 LLM 入门指南

作者&#xff1a;来自 Elastic Aditya Tripathi 如果说人工智能在 2023 年起飞&#xff0c;这绝对是轻描淡写的说法。数千种新的人工智能工具被推出&#xff0c;人工智能功能被添加到现有的应用程序中&#xff0c;好莱坞因对这项技术的担忧而戛然而止。 甚至还有一个人工智能工…

【Kotlin】自定义Json反序列化

最近在项目中发现之前同事在使用Redis存储对象的时候&#xff0c;给日期字段存了两种不同的日期格式&#xff0c;进而导致查询时反序列化报错&#xff0c;因此写了一个注解配置类来自定义反序列化的方式。 /*** LocalDateTime反序列化&#xff0c;下方的LocalDate同理&#xff…

C++强制类型转换之static_cast

例1&#xff0c;将 double 类型转换为 int 类型 double d 5.5; int i static_cast<int>(d); printf("i %d\n", i);运行结果如下&#xff1a; i 5例2&#xff0c;将 int 类型转换为 double 类型 int a 10; int b 3; double c a / b; double d static…

代码随想录 Leetcode46. 全排列

题目&#xff1a; 代码&#xff08;首刷自解 2024年2月6日&#xff09;&#xff1a; class Solution { private:vector<vector<int>> res;vector<int> path; public:void backtracking(vector<int>& nums, int depth, vector<bool>& us…

golang+selenium自动化+chrome浏览器操作

1,selenium 是自动化测试以及自动化爬取的框架,常用于python开发,今天这里使用golang selenium进行自动化开发,相比python,主要是社区广泛,golang同样也是跟python功能一样,同时go可以支持大并发携程 自动化爬取节省资源,下面我们就直接上代码案例操作 1,首先需要下载谷歌驱动,…

EmoLLM-心理健康大模型

宣传一下自己最近参与的开源 https://github.com/aJupyter/EmoLLM EmoLLM-心理健康大模型 EmoLLM 探索本项目的文档 查看Demo 报告Bug 提出新特性 EmoLLM 是一个能够支持 理解用户-支持用户-帮助用户 心理健康辅导链路的心理健康大模型&#xff0c;由 InternLM2 指令微…

数据结构第十天(排序算法总结)

目录 前言 常数时间复杂度&#xff1a;O(1) 线性时间复杂度&#xff1a;O(n) 线性对数时间复杂度&#xff1a;O(n log n) 平方时间复杂度&#xff1a;O(n^2) 对数时间复杂度&#xff1a;O(log n) 前言 排序算法的学习可以告一段落了。但算法的学习永不停止。 今天&…

redis:七、集群方案(主从复制、哨兵模式、分片集群)和面试模板

redis集群方案 在Redis中提供的集群方案总共有三种&#xff08;一般一个redis节点不超过10G内存&#xff09; 主从复制哨兵模式分片集群 主从复制&#xff08;主从数据同步&#xff09; replid和offset Replication Id&#xff1a;简称replid&#xff0c;是数据集的标记&a…

C++集群聊天服务器 数据模块+业务模块+CMake构建项目 笔记 (上)

跟着施磊老师做C项目&#xff0c;施磊老师_腾讯课堂 (qq.com) 本文在此篇博客的基础上继续实现数据模块和业务模块代码&#xff1a; C集群聊天服务器 网络模块业务模块CMake构建项目 笔记 &#xff08;上&#xff09;-CSDN博客https://blog.csdn.net/weixin_41987016/article…

显示器校准软件:BetterDisplay Pro for Mac v2.0.11激活版下载

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件&#xff0c;可以帮助用户调整显示器的颜色和亮度&#xff0c;以获得更加真实、清晰和舒适的视觉体验。 软件下载&#xff1a; BetterDisplay Pro for Mac v2.0.11激活版下载 以下是BetterDisplay Pro的主要…

【Linux取经路】探寻shell的实现原理

文章目录 一、打印命令行提示符二、读取键盘输入的指令三、指令切割四、普通命令的执行五、内建指令执行5.1 cd指令5.2 export指令5.3 echo指令 六、结语 一、打印命令行提示符 const char* getusername() // 获取用户名 {return getenv("USER"); }const char* geth…

LeetCode-第171题-Excel表的序列号

1.题目描述 给你一个字符串 columnTitle &#xff0c;表示 Excel 表格中的列名称。返回 该列名称对应的列序号 。 例如&#xff1a; A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 2.样例描述 3.思路描述 遍历时将每个字母与 A 做减法&…

抖音创作服务平台的自适应,从2560到1024,做的真是棒呀。

不得不服&#xff0c;抖音创作服务平台的电脑页面&#xff0c;自适应效果做的非常好&#xff0c;从2560到1024这个跨度的分辨率都做了很好地处理。 2560 4K屏 1920 2K屏幕 1600 宽屏 1440 中宽屏 1366 笔记本屏 1280 窄屏 1024 超窄屏 768 pad端 这个出现横向滚动条了。 算是用…

虚拟飞控计算机:飞行控制系统验证与优化的利器

01.背景介绍 随着航空技术的飞速发展&#xff0c;飞行控制系统作为飞机的心脏&#xff0c;全面负责监测、调整和维持飞行器的姿态、航向、高度等参数&#xff0c;用以确保飞行的安全和稳定。为了满足这些要求&#xff0c;现代飞控系统通常采用先进的处理器和外设来确保其高效、…

一文简介Maven初级使用

一.概述 Maven是专门用于管理和构建Java项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构提供了一套标准化的项目构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布&#xff09;提供了一套依赖管理机制 一方面&…

【Java EE】----Bean的作用域和生命周期

1.Bean的作用域 定义&#xff1a;Bean 的作⽤域是指 Bean 在 Spring 整个框架中的某种⾏为模式&#xff0c;⽐如 singleton 单例作⽤域&#xff0c;就 表示 Bean 在整个 Spring 中只有⼀份 &#xff08;产生的原因&#xff0c;Bean 默认情况下是单例状态&#xff08;singleton&…

docker-compose.yml 文件

编写 docker-compose.yml 文件是为了定义和管理 Docker 容器的配置&#xff0c;其中包括容器的构建、服务之间的连接、端口映射等。下面是一个示例 docker-compose.yml 文件&#xff0c;假设我们要部署一个简单的 Node.js 网站&#xff1a; yaml version: 3 services: web: …

隧道穿透:端口转发、socket隧道代理

目录 端口转发 lcx工具 Lcx工具正向连接 Lcx工具反向连接 SOCKET隧道代理 socks常见利用场景 Proxifier SocksCap64 Proxychains 端口转发 本篇会和搭建介绍一下端口转发和socket隧道代理的概念和简单演示 lcx工具 lcx工具是一个红队人员在内网渗透测试中最典型的端…

俩种方法解决 VScode中 NPM 脚本消失,NPM 脚本未显示在资源管理器侧栏中

npm脚本是npm包管理器的一个功能&#xff0c;允许开发者在package.json文件中定义一系列命令脚本&#xff0c;用于执行各种开发任务。 今天打开准备运行的时候发现找不到NPM脚本了&#xff0c;左侧的一栏完全没有显示&#xff0c;在网上查阅了很多资料后总结出俩个方法可以用来…