java CompletableFuture创建异步任务(Completable异步+ExecutorService线程池)

news2025/6/4 13:07:04

文章目录

  • 前置
  • 自定义线程池
  • 使用 CompletableFuture 创建异步任务

前置

来自 import java.util.concurrent.CompletableFuture;

自定义线程池

推荐根据业务需求配置

ExecutorService pool = new ThreadPoolExecutor(
    10, // 核心线程数
    20, // 最大线程数
    60L, TimeUnit.SECONDS, // 空闲线程存活时间
    new LinkedBlockingQueue<>(100), // 任务队列
    new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略
);

如果使用自定义线程池,确保在任务完成后关闭线程池(executorService.shutdown())

使用 CompletableFuture 创建异步任务

创建异步
有返回值异步任务,避免使用默认的 ForkJoinPool.commonPool(),尤其是在高并发场景下

// 有返回值的异步任务
// 默认使用 ForkJoinPool.commonPool(),也可自定义线程池
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    // 模拟耗时操作
    System.out.println("异步任务执行中...");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "任务结果";
});

// 有返回值的异步任务
// 自定义线程池
ExecutorService customPool = Executors.newFixedThreadPool(4);
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {...}, customPool);

// 后续通过.join 获取返回结果 T
future.join();

无返回值的异步任务

CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
    System.out.println("无返回值的异步任务执行中...");
    Thread.sleep(500);
});

处理异步返回结果(可链式处理)

// java 类似 map 映射处理 result 结果
CompletableFuture<String> resultFuture = future.thenApply(result -> {
    return "转换后的结果:" + result;
});

// 映射处理
CompletableFuture<String> composedFuture = future.thenCompose(result -> {
    // 根据前一个结果继续执行新的异步任务
    return anotherAsyncTask(result);
});

// thenRun()

// thenAccept()

allOf 和 anyOf
allOf 全部结束后发消息

// allOf 不是强等待他们结束,而是仅仅是他们结束后给个通知
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
allFutures.thenRun(() -> {
    System.out.println("所有任务已完成");
});

anyOf 任意结束后发消息

CompletableFuture<Object> anyFuture = CompletableFuture.anyOf(future1, future2);
anyFuture.thenAccept(result -> {
    System.out.println("任一任务完成,结果为: " + result);
});

等待线程执行完
等待单个线程执行完,使用 join 或者 get 获取 future 返回结果

// 创建一个异步任务
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000); // 模拟耗时操作
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "任务结果";
});


 // 主线程等待异步任务完成
String result = future.join(); // 或 future.get();
System.out.println("主线程获取结果: " + result);
System.out.println("主线程继续执行...");

等待多个线程都执行,使用 join 或者 get 获取 allFuture 返回结果

// 创建多个异步任务
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "任务1结果";
});
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> {
    try {
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return "任务2结果";
});

// 等待所有任务完成
CompletableFuture<Void> allFutures = CompletableFuture.allOf(future1, future2);
allFutures.join(); // 或 allFutures.get();

// 收集结果
String result1 = future1.join();
String result2 = future2.join();

设置超时时间

// orTimeout() 方法设置超时时间,避免无限等待
future.orTimeout(3, TimeUnit.SECONDS).exceptionally(ex -> {
    System.err.println("任务超时: " + ex.getMessage());
    return "默认结果";
});

异常处理

// exceptionally 捕获异常返回默认值
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
    if (Math.random() > 0.5) throw new RuntimeException("任务失败");
    return "成功结果";
}).exceptionally(ex -> {
    System.err.println("异常已捕获: " + ex.getMessage());
    return "默认结果"; // 返回默认值
});

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

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

相关文章

LeetCode 高频 SQL 50 题(基础版)之 【聚合函数】部分

题目&#xff1a;620. 有趣的电影 题解&#xff1a; select * from cinema where description !boring and id%21 order by rating desc题目&#xff1a;1251. 平均售价 题解&#xff1a; select p.product_id product_id,round(ifnull(sum(p.price*u.units)/sum(u.units),0)…

【AI学习】检索增强生成(Retrieval Augmented Generation,RAG)

1&#xff0c;介绍 出自论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》&#xff0c;RAG是权宜之计&#xff0c;通过RAG将问题简单化、精简化、剔除噪声&#xff0c;让LLM更容易理解、生成内容。RAG&#xff1a;检索增强技术检索生成&#xff08;重…

低成本高效图像生成:GPUGeek和ComfyUI的强强联合

一、时代背景 在如今的数字化时代&#xff0c;图像生成技术正不断发展和演变&#xff0c;尤其是在人工智能领域。无论是游戏开发、虚拟现实&#xff0c;还是设计创意&#xff0c;图像生成已成为许多应用的核心技术之一。然而&#xff0c;随着图像质量需求的提升&#xff0c;生成…

《操作系统真相还原》——进入内核

ELF 按书上的操作来&#xff0c;在现代操作平台编译链接默认生成elf64 格式的文件&#xff0c; 很显然程序头位置发生变化&#xff0c;因为定义elf 结构的类型中有64位&#xff0c;所以我们需要将编译链接出32位格式的 gcc -m32 -c -o main.o main.c ld -m elf_i386 main.o …

【QQ音乐】sign签名| data参数 | AES-GCM加密 | webpack(上)

1.目标 网址&#xff1a;https://y.qq.com/n/ryqq/toplist/26 切换榜单出现请求&#xff0c;可以看到sign和data是加密的 2.逆向分析 搜索sign: 可以看到sign P(n.data)&#xff0c;而n.data就是请求的加密data参数 data {"comm":{"cv":4747474,&qu…

【STM32】按键控制LED 光敏传感器控制蜂鸣器

&#x1f50e;【博主简介】&#x1f50e; &#x1f3c5;CSDN博客专家 &#x1f3c5;2021年博客之星物联网与嵌入式开发TOP5 &#x1f3c5;2022年博客之星物联网与嵌入式开发TOP4 &#x1f3c5;2021年2022年C站百大博主 &#x1f3c5;华为云开发…

M-OFDM模糊函数原理及仿真

文章目录 前言一、M序列二、M-OFDM 信号1、OFDM 信号表达式2、模糊函数表达式 三、MATLAB 仿真1、MATLAB 核心源码2、仿真结果①、m-OFDM 模糊函数②、m-OFDM 距离分辨率③、m-OFDM 速度分辨率④、m-OFDM 等高线图 四、资源自取 前言 本文进行 M-OFDM 的原理讲解及仿真&#x…

【MySQL】MVCC与Read View

目录 一、数据库并发的三种场景 二、读写场景的MVCC &#xff08;一&#xff09;表中的三个隐藏字段 &#xff08;二&#xff09;undo 日志 &#xff08;三&#xff09;模拟MVCC &#xff08;四&#xff09;Read View &#xff08;五&#xff09;当前读和快照读 三、RC和…

相机--双目立体相机

教程 链接1 教程汇总 立体匹配算法基础概念 视频讲解摄像机标定和双目立体原理 两个镜头。 双目相机也叫立体相机--Stereo Camera&#xff0c;属于深度相机。 作用 1&#xff0c;获取图像特征&#xff1b; 2&#xff0c;获取图像深度信息&#xff1b; 原理 原理和标定 …

多目标粒子群优化算法(MOPSO),用于解决无人机三维路径规划问题,Matlab代码实现

多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现 目录 多目标粒子群优化算法&#xff08;MOPSO&#xff09;&#xff0c;用于解决无人机三维路径规划问题&#xff0c;Matlab代码实现效果一览基本介绍…

工厂模式 vs 策略模式:设计模式中的 “创建者” 与 “决策者”

在日常工作里&#xff0c;需求变动或者新增功能是再常见不过的事情了。而面对这种情况时&#xff0c;那些耦合度较高的代码就会给我们带来不少麻烦&#xff0c;因为在这样的代码基础上添加新需求往往困难重重。为了保证系统的稳定性&#xff0c;我们在添加新需求时&#xff0c;…

37. Sudoku Solver

题目描述 37. Sudoku Solver 回溯 class Solution {vector<vector<bool>> row_used;vector<vector<bool>> col_used;vector<vector<bool>> box_used;public:void solveSudoku(vector<vector<char>>& board) {row_used.r…

RV1126-OPENCV 图像叠加

一.功能介绍 图像叠加&#xff1a;就是在一张图片上放上自己想要的图片&#xff0c;如LOGO&#xff0c;时间等。有点像之前提到的OSD原理一样。例如&#xff1a;下图一张图片&#xff0c;在左上角增加其他图片。 二.OPENCV中图像叠加常用的API 1. copyTo方法进行图像叠加 原理…

修改 vscode 左侧导航栏的文字大小 (更新版)

1. 起因&#xff0c; 目的: 问题&#xff1a; vscode 左侧的文字太小了&#xff01;&#xff01;&#xff01;我最火的一篇文章&#xff0c;写的就是这个问题。 看来这个问题&#xff0c;是很广泛的一个痛点。我最近更新了 vscode&#xff0c; 这个问题又出现了。再来搞一下。…

云原生 Cloud Native Build (CNB)使用初体验

云原生 Cloud Native Build&#xff08;CNB&#xff09;使用初体验 引言 当“一切皆可云”成为趋势&#xff0c;传统开发环境正被云原生工具重塑。腾讯云CNB&#xff08;Cloud Native Build&#xff09;作为一站式开发平台&#xff0c;试图解决多环境协作难题。 本文将分享c…

格式工厂 FormatFactory v5.20.便携版 ——多功能媒体文件转换工具 长期更新

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORWF3Q7D0eCVV06LHbzheD-A1?pwdjikz# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/8ee59ed83658 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

数据可视化--使用matplotlib绘制高级图表

目录 一、绘制等高线图 contour() 二、绘制矢量场流线图 streamplot() 三、绘制棉棒图 stem() 四、绘制哑铃图 五、绘制甘特图 六、绘制人口金字塔图 barh() 七、绘制漏斗图 简易版漏斗图 八、绘制桑基图 Sankey()---创建桑基图 add()---添加桑基图的选项 finish()…

如何做好一个决策:基于 Excel的决策树+敏感性分析应用

决策点: 开发新产品? (是 / 否) 因素 (如果是): 市场接受度 (高 / 中 / 低);概率: 高(0.3), 中(0.5), 低(0.2) 结果值 (NPV): 高(+$1M), 中(+$0.2M), 低(-$0.5M) 不开发成本/收益: $0 开发计算: EMV(市场接受度) = (0.3 * 1M) + (0.5 * 0.2M) + (0.2 * -0.5M) = $0.3M + $…

【模拟电子电路-工具使用】

模拟电子电路-工具使用 ■ 1. 模拟软件■ 1. circuit JS ■ 2. 万用表■ 3. 示波器■ 4.■ 5.■ 6.■ 7. ■ 1. 模拟软件 ■ 1. circuit JS ■ 2. 万用表 ■ 3. 示波器 ■ 4. ■ 5. ■ 6. ■ 7.

[ElasticSearch] ElasticSearch的初识与基本操作

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…