深入理解Java CompletableFuture并发编程模型
摘要:本文将介绍Java中的CompletableFuture类,探讨其在并发编程中的应用。我们将详细讨论CompletableFuture的特性、常见用法和最佳实践,帮助开发人员更好地利用这个强大的工具进行异步编程。
1. 什么是CompletableFuture?
CompletableFuture是Java 8中引入的一个类,它提供了一种方便、灵活和高效的方法来处理并发任务。CompletableFuture基于Future和Promise的概念,它可以表示一个异步计算的结果,并且可以通过回调机制或者组合其他CompletableFuture实例来实现复杂的异步操作。
2. CompletableFuture的特性
- 异步执行:CompletableFuture允许我们将任务提交到线程池中异步执行,避免阻塞主线程。
- 链式操作:通过thenApply、thenAccept、thenRun等方法,我们可以将多个CompletableFuture串联起来形成一个操作链,以便在每个任务完成后执行下一步操作。
- 组合操作:CompletableFuture提供了多种组合操作,如allOf、anyOf等,用于处理多个CompletableFuture实例的结果。
- 异常处理:可以使用exceptionally或handle方法捕获并处理异常情况,确保任务的稳定运行。
- 超时控制:可以使用completeOnTimeout或completeOnCancel方法设置任务的超时时间,并在超时后执行相应的操作。
3. CompletableFuture的常见用法
3.1 异步执行任务
使用CompletableFuture.runAsync和CompletableFuture.supplyAsync方法可以将任务提交到线程池中异步执行:
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {// 异步执行的任务
});CompletableFuture<T> future = CompletableFuture.supplyAsync(() -> {// 异步执行的任务,返回结果类型为T
});
3.2 链式操作
通过thenApply、thenAccept、thenRun等方法,我们可以将多个CompletableFuture实例串联起来形成一个操作链,以便在每个任务完成后执行下一步操作:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello").thenApply(s -> s + " World").thenApply(String::toUpperCase);future.thenAccept(System.out::println); // 打印结果:HELLO WORLD
3.3 组合操作
使用allOf、anyOf等方法可以处理多个CompletableFuture实例的结果:
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");CompletableFuture.allOf(future1, future2).thenRun(() -> {String result1 = future1.join();String result2 = future2.join();System.out.println(result1 + " " + result2); // 打印结果:Hello World});
3.4 异常处理
使用exceptionally或handle方法可以捕获并处理异常情况:
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {// 可能会抛出异常的任务throw new RuntimeException("Something went wrong");
});future.exceptionally(ex -> {System.out.println("Exception occurred: " + ex);return 0; // 指定默认值
});future.handle((result, ex) -> {if (ex != null) {System.out.println("Exception occurred: " + ex);return 0;} else {return result;}
});
3.5 超时控制
使用completeOnTimeout或completeOnCancel方法可以设置任务的超时时间,并在超时后执行相应的操作:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {// 异步执行的任务return "Result";
});CompletableFuture<String> timeoutFuture = future.completeOnTimeout("Timeout", 1, TimeUnit.SECONDS);timeoutFuture.thenAccept(System.out::println); // 如果任务在1秒内未完成,打印结果:Timeout
4. 完整示例
以下是一个完整的示例代码,展示了CompletableFuture在并发编程中的用法:
import java.util.concurrent.CompletableFuture;public class CompletableFutureExample {public static void main(String[] args) {CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "Hello").thenApply(s -> s + " World").thenApply(String::toUpperCase);future.thenAccept(System.out::println); // 打印结果:HELLO WORLD}
}
5. 结论
CompletableFuture是Java中强大的并发编程工具,通过异步执行、链式操作和组合等特性,可以极大地简化异步任务的处理。本文介绍了CompletableFuture的基本特性和常见用法,并提供了一些最佳实践。掌握CompletableFuture的使用,将有助于开发人员编写高效、可靠和响应式的并发代码。
相关文章:
深入理解Java CompletableFuture并发编程模型
摘要:本文将介绍Java中的CompletableFuture类,探讨其在并发编程中的应用。我们将详细讨论CompletableFuture的特性、常见用法和最佳实践,帮助开发人员更好地利用这个强大的工具进行异步编程。 1. 什么是CompletableFuture? Compl…...
TensorFlow手动加载数据集(以mnist为例)
在进行Mnist手写识别的项目中,出现了Mnist数据集下载出错的问题,报出以下错误: Exception: URL fetch failure on https://s3.amazonaws.com/img-datasets/mnist.npz: None – [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主…...
C++项目实战——基于多设计模式下的同步异步日志系统(总集篇)
文章目录 专栏导读项目介绍开发环境核心技术环境搭建日志系统介绍1.为什么需要日志系统2.日志系统技术实现2.1同步写日志2.2异步写日志 前置知识补充不定参函数C风格不定参函数不定参宏函数设计模式六大原则单例模式饿汉模式懒汉模式 工厂模式简单工厂模式工厂方法模式抽象工厂…...
杨辉三角按列求和
假设求杨辉三角这一列 我们考虑这个格子: 然后对其不断展开 综上: ∑ i 0 n ( i k ) ( n 1 k 1 ) \sum_{i0}^n\binom i k\binom {n1}{k1} i0∑n(ki)(k1n1) ∑ i l r ( i k ) ( r 1 k 1 ) − ( l k 1 ) \sum_{il}^r\binom i k\binom{r1}{k…...
C复习-语句
参考: 里科《C和指针》 语句 C没有bool,是用整型代替的。因此if(expression)中,expression只要是可以产生整型结果即可,且0表示假,非0表示真。 如果有只靠缩进没有{}的else语句,会自动匹配离它最近的、不…...
[Python进阶] 操纵键盘:PyAutoGUI
6.5 操纵键盘:PyAutoGUI 6.5.1 keyDown、keyUp 按下或弹起某个按键。在按下时不会释放。 参数: key(str): 要按下的键。有效的名称列在KEYBOARD_KEYS。 logScreenshot:是否要截图并保存在当前文件夹下。 import pyautoguipyautogui.keyDown(f) # 模拟…...
jdbc快速开始
文章目录 快速开始参考文献 jdbc 就是使用java语言操作关系型数据库的一套api jdbc本质: 官方(sun公司)定义的一套操作所有关系型数据库的规则,就是接口各个数据库厂商去实现这套接口,提供数据库驱动jar包我们可以使用这套接口编程ÿ…...
C语言中static关键字用法
C语言中static关键字用法 2021年7月28日席锦 static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。但是对于c语言初学者,static由于使用灵活,并不容易掌握。 变量 1.局部变量 普通局部变量是再…...
STM32-LCD液晶显示
LCD液晶显示 针对野火指南者配套资料:3.2寸 LCD电阻屏,屏幕里自带ILI9341液晶控制器芯片,该控制器芯片中存在GRAM(即显存)。该液晶控制器使用8080接口与单片机通讯,液晶面板引出来的FPC信号线为8080接口&am…...
GraphQL 查询:一个全面指南
GraphQL GraphQL 是一种 API 查询语言和运行时,用于使用现有数据完成这些查询。它为您的 API 中的数据提供了完整且易于理解的描述,让客户能够准确地询问他们需要什么,更容易随着时间的推移发展 API,并启用强大的开发人员工具。 …...
快速自动化处理JavaScript渲染页面的方法
目录 一、使用无头浏览器 二、使用JavaScript渲染引擎 三、使用前端框架工具 随着互联网技术的不断发展,JavaScript已经成为Web开发中不可或缺的一部分。然而,在自动化处理JavaScript渲染页面方面,却常常让开发者感到头疼。本文将介绍一些快…...
[计算机提升] 系统及用户操作
1.4 系统及用户操作 1.4.1 系统操作 1.4.1.1 开机、关机、重启 在Windows系统中,开机(Power On),关机(Shutdown)和重启(Restart)是指计算机的不同电源控制操作。 开机:…...
Linux篇 四、Linux修改用户名
Linux系列文章目录 一、香橙派Zero2设置开机连接wifi 二、香橙派Zero2获取Linux SDK源码 三、香橙派Zero2搭建Qt环境 文章目录 Linux系列文章目录前言一、更改用户名准备二、修改用户名总结 前言 想要把Ubuntu的普通用户名修改成自己想要的 一、更改用户名准备 LubanCat 镜像…...
【Element-plus】如何让滚动条永远在最底部(支持在线演示)
如何让滚动条永远在最底部 一、适用场景二、实现思路三、效果图四、在线演示五、完整代码 一、适用场景 在某些场景下,你可能希望滚动条保持在最底部,以确保用户始终看到最新的内容或信息。如:在实时聊天应用程序中,当新消息到达…...
解决方案-LBS用户位置Redis-GEO附近人/店铺
附近人 windows安装附近人列表功能mysqlredis GEO CNNVD-201511-230 未授权访问python 多线程 redis大端模式与小端模式IP地址的不同表现形式1.字符串表现形式2. 整数表现形式3.大小端模式下的IP地址 0x01 进入python正题Python的socket库1.socket.socket(family,type)2.socket…...
springboot+html实现简单注册登录
前端: register.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>register</title><link rel"stylesheet" type"text/css" href"/css/style.css&…...
ESP32网络开发实例-Web控制8路继电器
Web控制8路继电器 文章目录 Web控制8路继电器1、继器器介绍2、软件准备3、硬件准备4、代码实现4.1 单路继电器控制灯泡4.2 Web控制8路继电器将继电器与 ESP32 一起使用是远程控制交流家用电器的好方法。 本文介绍如何使用 ESP32 控制继电器模块。 我们将了解继电器模块的工作原…...
Flutter ☞ 变量
在Flutter中,变量分为两种类型 弱类型强类型 弱类型 var 如果没有初始值,可以变成任何类型 var a; // var a ; // 一旦赋值,就确定类型,不能随意改动 a abc; a 123; a true; a {key: 123}; a [abc];print(a)Object 动…...
冲刺十五届蓝桥杯P0006平面切分
文章目录 题目思路代码总结 题目 平面切分 思路 这道题是一个思维题把,之前没有接触过平面几何的知识,做起来感觉还是比较难的,用到的set集合和自己创建一个类 首先我们知道,一根直线A是可以将平面切分成两块的,如…...
mac电脑文献管理 EndNote 21最新 for Mac
EndNote 21 Mac版不仅能够快速有效的的帮助用户管理自己的文献,而且还可以用来创建个人参考文献库,添加各种文本,图像,连接,表格等等内容! - 搜索数百个在线资源以获取参考和PDF - 只需点击一下即可查找参…...
PCB设计前必知:五种生产工艺方案选型与Layout实战指南
1. 项目概述:PCB设计前必须厘清的生产工艺抉择画板子,尤其是电源板,画得再漂亮,如果生产不出来或者生产成本高得离谱,那一切努力都白费。我见过不少新手工程师,甚至是有些经验的老手,在PCB Layo…...
如何快速掌握FDS火灾模拟:面向新手的完整入门指南
如何快速掌握FDS火灾模拟:面向新手的完整入门指南 【免费下载链接】fds Fire Dynamics Simulator 项目地址: https://gitcode.com/gh_mirrors/fd/fds 你是否曾为建筑火灾风险评估而烦恼?是否需要对工业设施进行精确的火灾动力学分析?F…...
别再乱设JVM堆大小了!Elasticsearch 8.x 内存配置保姆级避坑指南
Elasticsearch 8.x 内存配置实战:从GC崩溃到性能巅峰的避坑手册 凌晨三点,服务器告警又一次响起。屏幕上的GC日志像瀑布一样滚动,节点频繁脱离集群,查询延迟突破天际——这可能是每个Elasticsearch运维人员都经历过的噩梦时刻。而…...
保姆级教程:用Node-RED把传感器数据传到ThingsBoard仪表盘(MQTT全流程)
从零构建物联网数据可视化:Node-RED与ThingsBoard的实战融合 在智能家居、工业监测等物联网场景中,如何将物理世界的传感器数据转化为直观的可视化图表?本文将手把手带您完成从硬件数据采集到云端展示的完整链路实现。不同于单纯的理论讲解&a…...
深度解析SacreBLEU:5个实战技巧提升机器翻译评估效率
深度解析SacreBLEU:5个实战技巧提升机器翻译评估效率 【免费下载链接】sacrebleu Reference BLEU implementation that auto-downloads test sets and reports a version string to facilitate cross-lab comparisons 项目地址: https://gitcode.com/gh_mirrors/s…...
STM32CubeMX配置FreeRTOS时,那个不起眼的定时器TIM16到底在干嘛?新手避坑指南
STM32CubeMX配置FreeRTOS时,那个不起眼的定时器TIM16到底在干嘛?新手避坑指南 第一次在STM32CubeMX里勾选FreeRTOS组件时,很多开发者会对配置页面底部那个"Hardware Timer"选项感到困惑——为什么默认选中了TIM16?这个看…...
接入Taotoken后我的月度API账单变得清晰可追溯且易于管理
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 接入Taotoken后我的月度API账单变得清晰可追溯且易于管理 在开发工作中,我们常常需要调用不同的大模型API来满足多样化…...
别再只用Leaflet了!Mapbox GL JS加载本地MVT矢量瓦片保姆级教程(附避坑点)
从Leaflet到Mapbox GL JS:解锁MVT矢量瓦片的进阶玩法 当传统WebGIS开发者第一次看到Mapbox GL JS渲染的矢量瓦片地图时,那种震撼感不亚于从黑白电视切换到4K HDR。Leaflet就像一把可靠的瑞士军刀,而Mapbox GL JS则像一套专业厨房设备——当你…...
从硬件连接到数据可视化:基于RS485-USB的传感器数据采集全流程解析
1. 硬件连接:从传感器到电脑的物理链路搭建 工业传感器数据采集的第一步,就是建立可靠的物理连接。以常见的星仪压力变送器为例,我们需要解决三个关键问题:传感器供电、信号传输转换、以及电脑端识别。这里我分享几个实际项目中容…...
三分钟解锁Windows 11任务栏:Taskbar11让你的桌面重获自由
三分钟解锁Windows 11任务栏:Taskbar11让你的桌面重获自由 【免费下载链接】Taskbar11 Change the position and size of the Taskbar in Windows 11 项目地址: https://gitcode.com/gh_mirrors/ta/Taskbar11 还在为Windows 11那固执的任务栏设置感到束手无策…...
