Java高级-CompletableFuture并发编程利器
CompletableFuture核心Api
- 1.概述
- 2.Async
- 2.a) supplyAsync
- 2.b) runAsync
- 3.Then
- 3.a) thenApply()
- 3.b) thenApplyAsync()
1.概述
Future可以在并发编程中异步获取结果
CompletableFuture实现了Future接口,肯定也会有Future的功能,也相当于是Future的一个升级版。
同时还实现了CompletionStage接口,CompletionStage表示某一个步骤,可以编排某些并发编程任务的功能
2.Async
2.a) supplyAsync
异步执行任务,任务有返回值
supplyAsync实现了Supplier接口
@Test
public void testSupplyAsync() throws ExecutionException, InterruptedException {// 设置线程池ExecutorService executorService = Executors.newFixedThreadPool(10);// 建议自己设置一个线程池。若未指定,将使用默认的线程池,会造成整个应用都会使用同一个线程池,会不太好CompletableFuture<String> task = CompletableFuture.supplyAsync(() -> {System.out.println(Thread.currentThread().getName());return "hello";}, executorService);// get()获取结果System.out.println(task.get());
}
2.b) runAsync
异步执行任务,任务没有返回值
runAsync实现了Runnable接口
@Test
public void testRunAsync() throws ExecutionException, InterruptedException {// 设置线程池ExecutorService executorService = Executors.newFixedThreadPool(10);// 建议自己设置一个线程池。若未指定,将使用默认的线程池,会造成整个应用都会使用同一个线程池,会不太好CompletableFuture task = CompletableFuture.runAsync(() -> System.out.println(Thread.currentThread().getName()));// get()获取结果System.out.println(task.get());
}
3.Then
当前一个异步任务执行完,才能执行本任务
当前执行thenApply()方法的线程来负责执行本任务,比如main线程。但是如果前一个异步任务还没有执行完,那么main线程就不能执行本任务了,要等前一个任务执行完后才能执行本任务。
3.a) thenApply()
当要睡眠1秒时,由主线程执行taskB
当不需要睡眠时,由执行taskA的子线程执行taskB,main线程会直接往下运行
@Test
public void testThen() throws InterruptedException {// 设置线程池ExecutorService executorService = Executors.newFixedThreadPool(10);Supplier<String> taskA = () -> {System.out.println("1: " + Thread.currentThread().getName());return "TaskA";};Function<String, String> taskB = (s) -> {System.out.println("2: " + Thread.currentThread().getName());return s + "TaskA";};CompletableFuture<String> future = CompletableFuture.supplyAsync(taskA, executorService);Thread.sleep(1000);// taskB 在 taskA 任务后执行,future.thenApply(taskB);System.out.println(Thread.currentThread().getName() + ": Finish...");
}
3.b) thenApplyAsync()
用另外的线程去执行任务
可以指定线程池来运行任务,若未指定,将使用默认的线程池。
该方法不会使用main线程去执行taskB
@Test
public void testThen() throws InterruptedException {// 设置线程池ExecutorService executorService = Executors.newFixedThreadPool(10);Supplier<String> taskA = () -> {System.out.println("1: " + Thread.currentThread().getName());return "TaskA";};Function<String, String> taskB = (s) -> {System.out.println("2: " + Thread.currentThread().getName());return s + "TaskA";};CompletableFuture<String> future = CompletableFuture.supplyAsync(taskA, executorService);Thread.sleep(1000);// taskB 在 taskA 任务后执行,future.thenApplyAsync(taskB, executorService);System.out.println(Thread.currentThread().getName() + ": Finish...");
}
相关文章:
Java高级-CompletableFuture并发编程利器
CompletableFuture核心Api 1.概述2.Async2.a) supplyAsync2.b) runAsync 3.Then3.a) thenApply()3.b) thenApplyAsync() 1.概述 Future可以在并发编程中异步获取结果 CompletableFuture实现了Future接口,肯定也会有Future的功能,也相当于是Future的一个…...
python、java、c++哪一个前景比较好?
Python是一种广泛使用的高级编程语言,适用于数据分析、人工智能、机器学习等领域。Java是一种通用的编程语言,适用于企业级应用开发、网站开发、软件开发、嵌入式领域等。C是一种系统编程语言,适用于嵌入式开发、游戏开发、音视频、服务端开发…...
【排序算法】详解直接插入排序和希尔排序原理及其性能分析
文章目录 插入排序算法原理细节分析代码实现复杂度分析:稳定性分析:与冒泡排序的对比 希尔排序算法原理细节分析代码实现复杂度分析稳定性分析 总结对比 插入排序 算法原理 插入排序又或者说直接插入排序,是一种和冒泡排序类似的并且比较简单的排序方法, 基本思想…...
JDK1.8对HashMap的优化、以及通过源码解析1,8扩容机制
JDK 1.8 对 HashMap 进行了一些优化,主要包括以下几个方面的改进: 红黑树:在 JDK 1.8 中,当哈希碰撞(多个键映射到同一个桶)达到一定程度时,HashMap 会将链表转化为红黑树,以提高查找…...
Linux串口断帧处理
报文格式 1 Byte 4 Byte N Byte 4 Byte 1 Byte 0x02 报文长度 报文 CRC16 0x03 1. 每条报文以 STX(0x02)起始符开始,以 ETX(0x03)终止符结束。 2. 报文正文长度采用 4 字节的 10 进制字符串标识,如报文正…...
springboot集成kafka
1、引入依赖 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId><version>2.8.6</version></dependency> 2、配置 server:port: 9099 spring:kafka:bootstrap-servers: 192.1…...
近期总结2023.10.16
规律 1.两数相减,相加的最大,最小值 2.由最初的状态递推 3.无强制顺序,排序,不能排序,则与顺序有关 4.对于一段等差数列,不用一段一段的算局部整体,可以从整体一步步加差值 5.需要从一段式子推到结果困难&…...
【EI会议征稿】第二届可再生能源与电气科技国际学术会议(ICREET 2023)
第二届可再生能源与电气科技国际学术会议(ICREET 2023) 2023 2nd International Conference on Renewable Energy and Electrical Technology 2020年中国可再生能源发电规模显著扩大,风力和太阳能发电均呈迅速增长趋势。中国大力推进能源低碳化,减少温…...
让ChatGPT等模型学会自主思考!开创性技术“自主认知”框架
ChatGPT、百度文心一言、Bard等大语言模型展现出了超强的创造能力,加速了生成式AI的应用进程。但AI模型只能基于训练数据执行各种任务,无法像人类一样利用生活知识、过往经验用于复杂的推理和决策。 例如,在玩游戏时,人类可以利用…...
Jmeter脚本参数化和正则匹配
我们在做接口测试过程中,往往会遇到以下几种情况 每次发送请求,都需要更改参数值为未使用的参数值,比如手机号注册、动态时间等 上一个接口的请求体参数用于下一个接口的请求体参数 上一个接口的响应体参数用于下一个接口的请求体参数&#…...
vue 请求代理 proxy
目录 为什么需要配置代理 什么是同源策略 如何配置代理 请求代理的原理 举例说明 为什么需要配置代理 因为浏览器的同源策略,当向和本地 devServer 服务器不同源的地址发送请求, 会违反浏览器的同源策略,导致发送失败,所以需…...
使用Spring Boot构建稳定可靠的分布式爬虫系统
摘要:本文将介绍如何使用Spring Boot框架构建稳定可靠的分布式爬虫系统。我们将从系统设计、任务调度、数据存储以及容灾与故障恢复等方面进行详细讲解,帮助读者理解并实践构建高效的分布式爬虫系统。 1. 引言 随着互联网的快速发展,爬虫系…...
分享一个查询OpenAI Chatgpt key余额查询的工具网站
OpenAI Key 余额查询工具 欢迎使用 OpenAI Key 余额查询工具网站!这个工具可以帮助您轻松地验证您的 OpenAI API 密钥,并查看您的余额。 http://tools.lbbit.top/check_key/ 什么是 OpenAI Key 余额查询工具? OpenAI Key 余额查询工具是一…...
【LeetCode刷题(数据结构与算法)】:二叉树的后序遍历
给你一棵二叉树的根节点root 返回其节点值的后序遍历 示例 1: 输入:root [1,null,2,3] 输出:[3,2,1] 示例 2: 输入:root [] 输出:[] 示例 3: 输入:root [1] 输出:[1]…...
内网、外网、宽带、带宽、流量、网速之间的区别与联系
一.带宽与宽带的区别是什么? 带宽是量词,指的是网速的大小,比如1Mbps的意思是一兆比特每秒,这个数值就是指带宽。 宽带是名词,说明网络的传输速率速很高 。宽带的标准各不相同,最初认为128kbps以上带宽的就…...
打造类ChatGPT服务,本地部署大语言模型(LLM),如何远程访问?
ChatGPT的成功,让越来越多的人开始关注大语言模型(LLM)。如果拥有了属于自己的大语言模型,就可以对其进行一些专属优化。例如:打造属于自己的AI助理,或是满足企业自身的业务及信息安全需求。 所以ÿ…...
linux平台的无盘启动开发
by fanxiushu 2023-10-15 转载或引用请注明原始作者。 前一章节介绍的是linux平台下的虚拟磁盘驱动开发过程,主要讲述了 基于block的磁盘和基于SCSI接口的磁盘。 本文介绍的内容正是基于上文中的SCSI接口的虚拟磁盘实现的无盘启动。 同样的,linux系统下也…...
【GO入门】环境配置及Vscode配置
1 GO环境配置 欢迎来到Go的世界,让我们开始探索吧! Go是一种新的语言,一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点: 它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。Go为软件构造提供了一种模型&…...
家政服务小程序,家政维修系统,专业家政软件开发商;家政服务小程序,家政行业软件开发
家政服务小程序,家政维修系统,专业家政软件开发商; 家政服务小程序,家政行业软件开发解决方案,家政软件经验丰富实践,系统高度集成,提供师傅端、用户端、… 家政服务app开发架构有 1、后台管理端…...
英语——语法——从句——状语从句——笔记
一、概念 状语从句(Adverbial Clause)是指句子用作状语时,起副词作用的句子。状语从句中的从句可以修饰谓语。 状语从句根据其作用可分为时间、地点、原因、条件、目的、结果、让步、方式和比较等九 种状语从句。状语从句一般由连词(从属连词…...
华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
[C++错误经验]case语句跳过变量初始化
标题:[C错误经验]case语句跳过变量初始化 水墨不写bug 文章目录 一、错误信息复现二、错误分析三、解决方法 一、错误信息复现 write.cc:80:14: error: jump to case label80 | case 2:| ^ write.cc:76:20: note: crosses initialization…...
uni-app学习笔记二十七--设置底部菜单TabBar的样式
官方文档地址:uni.setTabBarItem(OBJECT) | uni-app官网 uni.setTabBarItem(OBJECT) 动态设置 tabBar 某一项的内容,通常写在项目的App.vue的onLaunch方法中,用于项目启动时立即执行 重要参数: indexnumber是tabBar 的哪一项&…...
dvwa11——XSS(Reflected)
LOW 分析源码:无过滤 和上一关一样,这一关在输入框内输入,成功回显 <script>alert(relee);</script> MEDIUM 分析源码,是把<script>替换成了空格,但没有禁用大写 改大写即可,注意函数…...
Monorepo架构: 项目管理模式对比与考量
关于 monorepo 相关概念及项目管理模式 在软件开发中,尤其是前端项目,我们会涉及到不同的项目管理模式,这里先介绍几个重要的概念“monorepo”是当前较为热门的一种项目管理方式,虽然很多人可能听说过,但可能在实际项…...
【计算机网络】NAT、代理服务器、内网穿透、内网打洞、局域网中交换机
🔥个人主页🔥:孤寂大仙V 🌈收录专栏🌈:计算机网络 🌹往期回顾🌹:【计算机网络】数据链路层——ARP协议 🔖流水不争,争的是滔滔不息 一、网络地址转…...
