springboot 异步操作
有以下两个实现功能的方法public String getName(){ // 模拟功能的耗时操作 try { Thread.sleep(2000); // 模拟耗时操作 } catch (InterruptedException e) { e.printStackTrace(); } return csdn:sorako; } public String getCover(){ // 模拟功能的耗时操作 try { Thread.sleep(2000); // 模拟耗时操作 } catch (InterruptedException e) { e.printStackTrace(); } return cover; }有一个需求需要异步调用获得结果之后在执行数据库Mapper插入数据库操作用打印表示一、异步调用一个方法如果是如下写法FileInfo fileInfo new FileInfo(); CompletableFutureString future CompletableFuture.supplyAsync(() - getName()); future.thenAccept(name - fileInfo.setFileName(name)).exceptionally(ex - { log.error(异步执行失败); return null; }); //执行Mapper。。。。。。。。。。 System.out.println(fileInfo fileInfo);答案是mapper执行sql后插入数据库的数据为空在异步调用时会直接执行主线程的后续部分没有等异步执行返回结果就直接执行mapper中的操作了。所以可以把mapper操作放到回调函数中执行FileInfo fileInfo new FileInfo(); CompletableFutureString future CompletableFuture.supplyAsync(() - getName()); future.thenAccept(name - { fileInfo.setFileName(name); //执行Mapper。。。。。。。。。。 System.out.println(fileInfo fileInfo); }).exceptionally(ex - { log.error(异步执行失败); return null; });但是执行会发现控制条没有任何信息因为主线程已经结束了异步调用还没走到mapper操作打印那里但是如果在主线程还没结束是会打印出来信息的。我们让主线程暂停几秒模拟一些后续操作。结果如下但是事实上我们无法预测是否主线程后续操作的结束时间前异步调用能执行所以我们可以让主线程必须在异步调用返回结果后在执行FileInfo fileInfo new FileInfo(); CompletableFutureString future CompletableFuture.supplyAsync(() - getName()); future.thenAccept(name - { fileInfo.setFileName(name); //执行Mapper。。。。。。。。。。 System.out.println(fileInfo fileInfo); }).exceptionally(ex - { log.error(异步执行失败); return null; }); // 等待异步任务完成 try { future.get(); // 或者 future.join(); } catch (Exception e) { log.error(等待异步任务时发生错误: e.getMessage()); }也可以简化在这里.get()会等待异步调用完成,但是也会可能抛出异常,需要抛出捕获,我们可以用.join()代替这两个的区别AI生成future.get() 和 future.join() 都是用于处理并发编程中异步任务的结果但它们属于不同的编程框架或库并且具有不同的用途和行为。### future.get()- **库**: Java 的 java.util.concurrent.Future 接口。- **用途**: 用于获取异步计算的结果。- **行为**:- 调用 future.get() 会阻塞调用线程直到异步任务完成并返回结果。- 如果任务尚未完成调用线程会被挂起直到任务完成。- 如果任务执行过程中抛出异常future.get() 会将异常重新抛出。- **示例**:Future future executorService.submit(() - {// 模拟一个异步任务Thread.sleep(2000);return 123;});try {Integer result future.get(); // 这会阻塞直到任务完成System.out.println(Result: result);} catch (InterruptedException | ExecutionException e) {e.printStackTrace();}### future.join()- **库**: Java 的 Thread 类或 Kotlin 的协程join() 在 Kotlin 协程中表现为 await()。- **用途**: 用于等待一个线程或协程完成。- **行为**:- 在 Java 中thread.join() 会使当前线程调用 join() 的线程等待直到目标线程终止。- **示例**:Thread thread new Thread(() - {// 模拟一个任务try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(“Thread finished”);});thread.start();try {thread.join(); // 这会阻塞直到线程完成} catch (InterruptedException e) {e.printStackTrace();}System.out.println(“Main thread continues”);### 总结- future.get() 是 Java 并发库中的方法用于获取异步任务的结果并阻塞调用线程直到任务完成。- join() 是 Java 线程的方法用于等待一个线程完成。它们虽然都涉及到等待某个任务完成但应用场景和所属的库不同。但是有人就会问了在这里等待异步调用完成再执行后续操作那不如不使用异步操作好像确实是这样那假如是执行两个异步操作呢二、异步调用两个方法异步调用执行两个方法FileInfo fileInfo new FileInfo(); CompletableFutureString future1 CompletableFuture.supplyAsync(() - getName()); CompletableFutureString future2 CompletableFuture.supplyAsync(() - getCover()); // 使用allOf等待所有Future完成 CompletableFutureVoid allFutures CompletableFuture.allOf(future1, future2); // 注册回调当所有Future都完成时执行 allFutures.thenRun(() - { try { String fileName future1.get(); String fileCover future2.get(); fileInfo.setFileName(fileName); fileInfo.setFileCover(fileCover); //执行Mapper。。。。。。。。。。 System.out.println(fileInfo fileInfo); } catch (Exception e) { log.error(异步执行失败); } }).exceptionally(ex - { ex.printStackTrace(); return null; }).join();当然还是用使用.join()或者.get()保证异步调用执行完这里我们可以看出执行时间2s.24ms那如果不使用异步调用呢执行时间4s.35ms可以看出在多个异步调用执行复杂操作时效率是更高的。当然这里的前提都是主程序的后续执行需要异步调用后返回执行结果如果不需要异步调用的返回结果。那首选异步操作。

相关新闻

单相全桥逆变器-工作原理

单相全桥逆变器-工作原理

逆变器的核心功能是将直流电(DC)转换为交流电(AC)。本文将直击核心,按照信号流向,拆解单相全桥逆变器的底层工作原理。1. 拓扑基础:H桥电路与电压极性翻转直流变交流,首要任务是改变…

2026/7/4 16:59:26 阅读更多 →
2026年降AI工具性价比排行:花最少的钱降到最低

2026年降AI工具性价比排行:花最少的钱降到最低

2026年降AI工具性价比排行:花最少的钱降到最低 室友花了200块降AI,我花了不到30块,最后我们的知网AI率都在10%以下。 这件事发生在上个月。我们俩的论文差不多长,都是1.2万字左右。他去找了淘宝代降,200块钱还不包过…

2026/5/17 12:54:47 阅读更多 →
沈阳沈河区专业的电脑维修靠谱

沈阳沈河区专业的电脑维修靠谱

在沈阳沈河区,电脑出现问题是不是让你头疼不已?找了多家维修店,不是价格不透明就是维修质量没保障?别急,今天我就给大家揭秘一家靠谱的电脑维修公司——极速修电脑维修公司!冲突一:维修速度慢&a…

2026/5/17 12:54:46 阅读更多 →

最新新闻

ChatGPT插件API密钥安全管理实战:从架构设计到自动化轮换

ChatGPT插件API密钥安全管理实战:从架构设计到自动化轮换

1. 项目概述:为什么ChatGPT插件密钥安全是生死线最近在折腾各种AI工具和插件,发现一个挺普遍但又被很多人忽视的问题:ChatGPT插件的API密钥管理。无论是自己开发插件,还是使用别人的,密钥泄露的风险都像悬在头顶的达摩…

2026/7/4 22:52:53 阅读更多 →
基于YOLOv8-seg的高精度道路缺陷检测系统开发

基于YOLOv8-seg的高精度道路缺陷检测系统开发

1. 项目背景与核心价值道路缺陷检测是智慧交通和市政养护领域的关键技术痛点。传统人工巡检方式存在效率低、漏检率高、主观性强等问题,尤其在夜间或恶劣天气条件下表现更差。我们团队基于YOLOv8-seg框架,融合EfficientRepBiPAN、AFPN-P345等50余项创新改…

2026/7/4 22:50:52 阅读更多 →
AI技术决策指南:从信息过载到可执行落地

AI技术决策指南:从信息过载到可执行落地

1. 项目概述:一份AI领域 Newsletter 的真实价值拆解“This AI newsletter is all you need #60”——看到这个标题,你第一反应可能是:又一份泛泛而谈的AI资讯合集?点开就看三行摘要、五个链接、一个ChatGPT新插件预告,…

2026/7/4 22:46:48 阅读更多 →
TC78H660FTG与PIC18F86J10的直流电机驱动优化方案

TC78H660FTG与PIC18F86J10的直流电机驱动优化方案

1. 项目背景与核心器件选型在工业自动化和消费电子领域,直流电机驱动系统的效率优化一直是工程师面临的关键挑战。TC78H660FTG作为东芝新一代H桥驱动器,与Microchip的PIC18F86J10微控制器组合,为解决这一问题提供了高性价比方案。TC78H660FTG…

2026/7/4 22:46:48 阅读更多 →
AntiDupl终极指南:三步快速清理重复照片,释放磁盘空间

AntiDupl终极指南:三步快速清理重复照片,释放磁盘空间

AntiDupl终极指南:三步快速清理重复照片,释放磁盘空间 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl AntiDupl是一款专业的开源图片去重工具&a…

2026/7/4 22:42:44 阅读更多 →
基于STM32和MAX9744的高效D类音频放大器设计

基于STM32和MAX9744的高效D类音频放大器设计

1. 项目背景与核心器件选型在音频系统设计中,功率放大环节直接决定了最终的声音表现。传统AB类放大器虽然音质优秀,但效率普遍低于50%,导致发热严重、能耗高。而D类放大器采用PWM调制技术,理论效率可达90%以上,特别适合…

2026/7/4 22:40:42 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻