Java中的异步编程:使用CompletableFuture提升并发性能

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界

引言

在现代应用程序中,响应速度和并发性能变得越来越重要。随着处理任务变得复杂,应用程序常常需要同时处理多个任务,这对系统资源和性能提出了严峻的挑战。在传统的阻塞式编程模型中,线程等待任务完成往往会导致资源浪费,影响整体的并发能力和响应速度。

为了应对这些挑战,Java 8引入了CompletableFuture,这是一种灵活的异步编程工具,它允许我们轻松实现并行任务处理,避免线程阻塞,从而提升系统的并发性能。本文将深入探讨如何使用CompletableFuture及其相关工具进行异步编程,通过丰富的代码示例展示它在提升并发性能中的强大能力。

目录

  1. 异步编程的意义
  2. Java中的Future接口概述
  3. CompletableFuture简介
  4. 使用CompletableFuture进行异步计算
  5. 组合多个异步任务
  6. 处理异步任务的结果
  7. 异常处理与恢复
  8. 自定义Executor提升性能
  9. 实践中的异步编程案例
  10. 总结

1. 异步编程的意义

异步编程是指在处理任务时,程序可以不必等待任务的完成,允许其他任务继续执行。这种模式在处理IO操作、网络请求、文件读写等耗时任务时,尤为重要。通过异步编程,我们可以避免不必要的线程阻塞,提升系统的整体效率。

传统的阻塞式编程模式,例如使用Thread.sleep()等待任务完成,通常会导致CPU空转,浪费了宝贵的系统资源。而异步编程通过回调机制、事件驱动或任务组合,能够让CPU充分利用时间,处理其他任务,从而提升并发性能。


2. Java中的Future接口概述

在Java 5中,引入了Future接口,用于表示异步计算的结果。Future可以让我们启动一个异步任务并返回一个表示结果的对象。我们可以通过调用get()方法来获取异步任务的结果。

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(() -> {Thread.sleep(1000);return 42;
});
System.out.println(future.get()); // 阻塞直到任务完成

虽然Future提供了一种异步计算的方式,但它有几个局限性:

  • 阻塞获取结果future.get()方法是阻塞的,必须等待任务完成才能继续。
  • 无法主动取消任务Future的取消操作依赖于任务的执行状态。
  • 任务组合困难:多个Future的结果组合较为繁琐。

为了解决这些问题,Java 8引入了更为强大的CompletableFuture


3. CompletableFuture简介

CompletableFuture 是 Java 8 中新增的类,扩展了Future接口,提供了更丰富的功能。它不仅允许非阻塞地获取异步计算的结果,还支持任务的组合、链式调用和异常处理。此外,CompletableFuture 内部结合了ForkJoinPool,实现了高效的线程管理。

CompletableFuture 的核心方法

方法描述
supplyAsync异步地执行一个供应函数并返回结果。
thenApply在异步任务完成后,对结果进行转换。
thenAccept异步任务完成后,对结果执行某个操作(无返回值)。
thenCombine组合两个异步任务的结果。
exceptionally处理异步任务中的异常情况。
complete手动完成任务并提供结果。
join阻塞地获取异步任务的结果,但不抛出InterruptedException

4. 使用CompletableFuture进行异步计算

在实际开发中,我们经常需要执行异步任务并获取结果。CompletableFuture允许我们在不阻塞主线程的情况下执行耗时操作,例如网络请求或文件读写。我们可以通过CompletableFuture.supplyAsync方法来启动异步任务。

4.1 基本示例

以下是一个简单的异步计算示例,它模拟了一个耗时的计算任务,并在任务完成后获取结果。

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;public class AsyncExample {public static void main(String[] args) throws ExecutionException, InterruptedException {// 启动异步任务CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {try {Thread.sleep(1000);  // 模拟耗时任务} catch (InterruptedException e) {e.printStackTrace();}return 42;});// 获取异步任务结果System.out.println("计算结果: " + future.get());  // 阻塞获取结果}
}

4.2 非阻塞获取结果

使用get()方法会阻塞当前线程,直到异步任务完成。为了实现真正的异步效果,我们可以使用thenAccept()方法,在任务完成时处理结果,而不阻塞主线程。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {try {Thread.s

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

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

相关文章

MacOS RocketMQ安装

MacOS RocketMQ安装 文章目录 MacOS RocketMQ安装一、下载二、安装修改JVM参数启动关闭测试关闭测试测试收发消息运行自带的生产者测试类运行自带的消费者测试类参考博客&#xff1a;https://blog.csdn.net/zhiyikeji/article/details/140911649 一、下载 打开官网&#xff0c;…

并发-线程

1, 线程 线程(thread)也是并发的一种形式&#xff0c;线程是比进程更小的活动单位&#xff0c;一个进程中可以有多个线程&#xff0c;线程是进程内部的一个执行分支。 一个进程刚开始时只有一个线程(称之为主线程)&#xff0c;后续的代码中可以创建新的线程&#xff0c;可以指…

git提交到github个人记录

windows下git下载 1.进入git官网https://git-scm.com/downloads/win 一直默认选项即可 2.在settings中SSH and GPG keys中Add SSH key 3.选择git cmd git使用 1.配置用户名&#xff0c;和邮箱 git config --global user.email "youexample.com" git config --g…

aws(学习笔记第六课) AWS的虚拟私有,共有子网以及ACL,定义公网碉堡主机子网以及varnish反向代理

aws(学习笔记第六课) AWS的虚拟私有&#xff0c;共有子网以及ACL&#xff0c;定义公网碉堡主机子网以及varnish反向代理 学习内容&#xff1a; AWS的虚拟私有&#xff0c;共有子网以及ACL定义公网碉堡主机子网&#xff0c;私有子网和共有子网以及varnish反向代理 1. AWS的虚拟…

深入理解WPF中的命令机制

Windows Presentation Foundation&#xff08;WPF&#xff09;是微软推出的一种用于构建桌面客户端应用程序的技术。它被认为是现代Windows应用程序的基础&#xff0c;具有强大的图形和媒体处理能力。在WPF中&#xff0c;“命令”是一个重要的概念&#xff0c;它为应用程序开发…

如何在算家云搭建Video-Infinity(视频生成)

一、模型介绍 Video-Infinity是一个先进的视频生成模型&#xff0c;使用多个 GPU 快速生成长视频&#xff0c;无需额外训练。它能够基于用户提供的文本或图片提示&#xff0c;创造出高质量、多样化的视频内容。 二、模型搭建流程 1.大模型 Video-Infinity 一键使用 基础环境…

Nest.js 实战 (十四):如何获取客户端真实 IP

问题解析 在 Nest.js 应用中&#xff0c;当你试图通过 request.ip 获取客户端的 IP 地址时&#xff0c;如果总是返回 ::1 或者 ::ffff:127.0.0.1&#xff0c;这通常意味着请求来自本地主机。 因为在前后端分离应用中&#xff0c;前端请求后端服务一般的做法都是通过代理&…

SQL进阶技巧:如何删除第N次连续出现NULL值所存在的行?

目录 0 场景描述 1 数据准备 2 问题分析 问题拓展:如何删除第2次、第3次、第N次连续出现NULL值所在的行? 3 小结 0 场景描述 有下面的场景: 我们希望删除某id中连续存在NULL值的所有行,但是保留第一次出现不为NULL值的以下所有存在NULL值的行。具体如下图所示: 如…

Leetcode 判断子序列

通过双指针来判断字符串s是否是字符串t的子序列。 算法思想&#xff1a; 双指针法&#xff1a; 我们使用两个指针i和j分别遍历字符串s和t。初始时&#xff0c;i指向s的第一个字符&#xff0c;j指向t的第一个字符。 匹配字符&#xff1a; 每次比较s[i]和t[j]&#xff1a; 如果…

大数据治理-数据质量管理

目录 一、定义数据质量 1.1 数据质量的定义 1.2 数据质量的重要性 二、常见的数据质量问题 2.1 数据不准确 2.2 数据不完整 2.3 数据不一致 2.4 数据不及时 2.5 数据无效 2.6 数据重复 三、数据清洗与转换 3.1 数据清洗 3.1.1 数据审计 3.1.2 数据验证 3.1.3 数…

uniapp小程序自定义聚合点

注&#xff1a; 1.默认的聚合点可以点击自动展示子级点位&#xff0c;但是自定义的聚合点在ios上无法触发markerClusterClick的监听&#xff0c;至今未解决&#xff0c;不知啥原因 2.ios和安卓展示的点位样式还有有差别 源码附上 <template><view class"marke…

Linux - 环境变量 | 命令行参数 | 进程基础

文章目录 一、了解冯诺依曼体系结构1、概念2、对数据层面3、实例二、操作系统1、概念2、设计OS的目的3、定位4、操作系统怎么管理&#xff1f; 三、进程1、概念2、怎么管理进程3、描述进程-PCB4、描述进程怎么运行&#xff08;粗略&#xff09;5、进程属性6、创建子进程7、创建…

PDF文件为什么不能编辑是?是啥原因导致的,有何解决方法

PDF文件格式广泛应用于工作中&#xff0c;但有时候我们可能遇到无法编辑PDF文件的情况。这可能导致工作效率降低&#xff0c;特别是在需要修改文件内容时显得尤为棘手。遇到PDF不能编辑时&#xff0c;可以看看是否以下3个原因导致的。 一、文件受保护 有些PDF文件可能被设置了…

ChatGPT 现已登陆 Windows 平台

今天&#xff0c;OpenAI 宣布其人工智能聊天机器人平台 ChatGPT 已开始预览专用 Windows 应用程序。OpenAI 表示&#xff0c;该应用目前仅适用于 ChatGPT Plus、Team、Enterprise 和 Edu 用户&#xff0c;是一个早期版本&#xff0c;将在今年晚些时候推出"完整体验"。…

[每周一更]-(第119期):“BP”大揭秘:生物学与金融学中的微小单位竟有如此大不同!

最近&#xff08;2024.09.29&#xff09;央行要把存量房贷在LPR&#xff08;贷款市场报价利率&#xff09;基础上&#xff0c;降低30BP&#xff0c;刚好基因行业内&#xff0c;也有bp的概念&#xff0c;通过发音无法区分&#xff0c;以下就讲解下生物学的bp和金融学的BP的概念的…

汽车零部件行业CRM应用数字化解决方案解析

1.行业背景与挑战分析 近年来&#xff0c;随着国家对新能源汽车行业的大力支持&#xff0c;国内汽车产业不仅在国内市场实现了弯道超车&#xff0c;而且新能源汽车的海外出口也开拓了新的市场&#xff0c;为自主品牌的新能源战略贡献了新的增长点&#xff1b;这一迅猛发展的趋…

最新版快递小程序源码 独立版快递系统 附教程

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 懂得都懂&#xff0c;现在电商平台退换货量大&#xff0c;快递需求量大&#xff0c;对接物流一个单子4块到6块之间 其中间是例如润 其余的 就不说了吧 互站上买的源码 分享一下 还有…

如何查看默认网关地址:详细步骤

在日常的网络配置与故障排查中&#xff0c;了解并正确查看默认网关地址是一项基础且至关重要的技能。默认网关是连接本地网络与外部网络&#xff08;如互联网&#xff09;的关键节点&#xff0c;它扮演着数据包转发的重要角色。无论是家庭网络、办公室网络还是更复杂的网络环境…

SSM框架学习(六、快速启动框架:SpringBoot3实战)

目录 一、SpringBoot3介绍 1.SpringBoot3简介 2.快速入门 3.入门总结 &#xff08;1&#xff09;Question1&#xff1a;为什么依赖不需要写版本&#xff1f; &#xff08;2&#xff09;Question2&#xff1a;启动器&#xff08;starter&#xff09;是什么&#xff1f; &a…

震惊!OpenAI突破性进展,清华天才联手破解扩散模型难题!

扩散模型很成功&#xff0c;但也有一块重大短板&#xff1a;采样速度非常慢&#xff0c;生成一个样本往往需要执行成百上千步采样。为此&#xff0c;研究社区已经提出了多种扩展蒸馏&#xff08;diffusion distillation&#xff09;技术&#xff0c;包括直接蒸馏、对抗蒸馏、渐…