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

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接口&#xff0c;肯定也会有Future的功能&#xff0c;也相当于是Future的一个…...

python、java、c++哪一个前景比较好?

Python是一种广泛使用的高级编程语言&#xff0c;适用于数据分析、人工智能、机器学习等领域。Java是一种通用的编程语言&#xff0c;适用于企业级应用开发、网站开发、软件开发、嵌入式领域等。C是一种系统编程语言&#xff0c;适用于嵌入式开发、游戏开发、音视频、服务端开发…...

【排序算法】详解直接插入排序和希尔排序原理及其性能分析

文章目录 插入排序算法原理细节分析代码实现复杂度分析:稳定性分析:与冒泡排序的对比 希尔排序算法原理细节分析代码实现复杂度分析稳定性分析 总结对比 插入排序 算法原理 插入排序又或者说直接插入排序,是一种和冒泡排序类似的并且比较简单的排序方法&#xff0c; 基本思想…...

JDK1.8对HashMap的优化、以及通过源码解析1,8扩容机制

JDK 1.8 对 HashMap 进行了一些优化&#xff0c;主要包括以下几个方面的改进&#xff1a; 红黑树&#xff1a;在 JDK 1.8 中&#xff0c;当哈希碰撞&#xff08;多个键映射到同一个桶&#xff09;达到一定程度时&#xff0c;HashMap 会将链表转化为红黑树&#xff0c;以提高查找…...

Linux串口断帧处理

报文格式 1 Byte 4 Byte N Byte 4 Byte 1 Byte 0x02 报文长度 报文 CRC16 0x03 1. 每条报文以 STX&#xff08;0x02&#xff09;起始符开始&#xff0c;以 ETX&#xff08;0x03&#xff09;终止符结束。 2. 报文正文长度采用 4 字节的 10 进制字符串标识&#xff0c;如报文正…...

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.两数相减&#xff0c;相加的最大&#xff0c;最小值 2.由最初的状态递推 3.无强制顺序&#xff0c;排序,不能排序&#xff0c;则与顺序有关 4.对于一段等差数列&#xff0c;不用一段一段的算局部整体&#xff0c;可以从整体一步步加差值 5.需要从一段式子推到结果困难&…...

【EI会议征稿】第二届可再生能源与电气科技国际学术会议(ICREET 2023)

第二届可再生能源与电气科技国际学术会议(ICREET 2023) 2023 2nd International Conference on Renewable Energy and Electrical Technology 2020年中国可再生能源发电规模显著扩大&#xff0c;风力和太阳能发电均呈迅速增长趋势。中国大力推进能源低碳化&#xff0c;减少温…...

让ChatGPT等模型学会自主思考!开创性技术“自主认知”框架

ChatGPT、百度文心一言、Bard等大语言模型展现出了超强的创造能力&#xff0c;加速了生成式AI的应用进程。但AI模型只能基于训练数据执行各种任务&#xff0c;无法像人类一样利用生活知识、过往经验用于复杂的推理和决策。 例如&#xff0c;在玩游戏时&#xff0c;人类可以利用…...

Jmeter脚本参数化和正则匹配

我们在做接口测试过程中&#xff0c;往往会遇到以下几种情况 每次发送请求&#xff0c;都需要更改参数值为未使用的参数值&#xff0c;比如手机号注册、动态时间等 上一个接口的请求体参数用于下一个接口的请求体参数 上一个接口的响应体参数用于下一个接口的请求体参数&#…...

vue 请求代理 proxy

目录 为什么需要配置代理 什么是同源策略 如何配置代理 请求代理的原理 举例说明 为什么需要配置代理 因为浏览器的同源策略&#xff0c;当向和本地 devServer 服务器不同源的地址发送请求&#xff0c; 会违反浏览器的同源策略&#xff0c;导致发送失败&#xff0c;所以需…...

使用Spring Boot构建稳定可靠的分布式爬虫系统

摘要&#xff1a;本文将介绍如何使用Spring Boot框架构建稳定可靠的分布式爬虫系统。我们将从系统设计、任务调度、数据存储以及容灾与故障恢复等方面进行详细讲解&#xff0c;帮助读者理解并实践构建高效的分布式爬虫系统。 1. 引言 随着互联网的快速发展&#xff0c;爬虫系…...

分享一个查询OpenAI Chatgpt key余额查询的工具网站

OpenAI Key 余额查询工具 欢迎使用 OpenAI Key 余额查询工具网站&#xff01;这个工具可以帮助您轻松地验证您的 OpenAI API 密钥&#xff0c;并查看您的余额。 http://tools.lbbit.top/check_key/ 什么是 OpenAI Key 余额查询工具&#xff1f; OpenAI Key 余额查询工具是一…...

【LeetCode刷题(数据结构与算法)】:二叉树的后序遍历

给你一棵二叉树的根节点root 返回其节点值的后序遍历 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xff1a;[] 示例 3&#xff1a; 输入&#xff1a;root [1] 输出&#xff1a;[1]…...

内网、外网、宽带、带宽、流量、网速之间的区别与联系

一.带宽与宽带的区别是什么&#xff1f; 带宽是量词&#xff0c;指的是网速的大小&#xff0c;比如1Mbps的意思是一兆比特每秒&#xff0c;这个数值就是指带宽。 宽带是名词&#xff0c;说明网络的传输速率速很高 。宽带的标准各不相同&#xff0c;最初认为128kbps以上带宽的就…...

打造类ChatGPT服务,本地部署大语言模型(LLM),如何远程访问?

ChatGPT的成功&#xff0c;让越来越多的人开始关注大语言模型&#xff08;LLM&#xff09;。如果拥有了属于自己的大语言模型&#xff0c;就可以对其进行一些专属优化。例如&#xff1a;打造属于自己的AI助理&#xff0c;或是满足企业自身的业务及信息安全需求。 所以&#xff…...

linux平台的无盘启动开发

by fanxiushu 2023-10-15 转载或引用请注明原始作者。 前一章节介绍的是linux平台下的虚拟磁盘驱动开发过程&#xff0c;主要讲述了 基于block的磁盘和基于SCSI接口的磁盘。 本文介绍的内容正是基于上文中的SCSI接口的虚拟磁盘实现的无盘启动。 同样的&#xff0c;linux系统下也…...

【GO入门】环境配置及Vscode配置

1 GO环境配置 欢迎来到Go的世界&#xff0c;让我们开始探索吧&#xff01; Go是一种新的语言&#xff0c;一种并发的、带垃圾回收的、快速编译的语言。它具有以下特点&#xff1a; 它可以在一台计算机上用几秒钟的时间编译一个大型的Go程序。Go为软件构造提供了一种模型&…...

家政服务小程序,家政维修系统,专业家政软件开发商;家政服务小程序,家政行业软件开发

家政服务小程序&#xff0c;家政维修系统&#xff0c;专业家政软件开发商&#xff1b; 家政服务小程序&#xff0c;家政行业软件开发解决方案&#xff0c;家政软件经验丰富实践&#xff0c;系统高度集成&#xff0c;提供师傅端、用户端、… 家政服务app开发架构有 1、后台管理端…...

英语——语法——从句——状语从句——笔记

一、概念 状语从句&#xff08;Adverbial Clause&#xff09;是指句子用作状语时&#xff0c;起副词作用的句子。状语从句中的从句可以修饰谓语。 状语从句根据其作用可分为时间、地点、原因、条件、目的、结果、让步、方式和比较等九 种状语从句。状语从句一般由连词(从属连词…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

Python环境安装与虚拟环境配置详解

本文档旨在为Python开发者提供一站式的环境安装与虚拟环境配置指南&#xff0c;适用于Windows、macOS和Linux系统。无论你是初学者还是有经验的开发者&#xff0c;都能在此找到适合自己的环境搭建方法和常见问题的解决方案。 快速开始 一分钟快速安装与虚拟环境配置 # macOS/…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...