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

Java教程——深入学习guava之并发编程

Guava并发编程深度解析

回调注册的核心概念

什么是回调注册?

回调注册是一种异步编程模式,它允许我们在启动一个异步任务后,预先定义任务完成时要执行的逻辑(回调函数),而不需要阻塞等待任务完成。

为什么需要回调注册?

在传统同步编程中:

Future<String> future = executor.submit(task); // 提交任务
String result = future.get(); // 阻塞等待结果
processResult(result); // 处理结果

这种模式存在两个关键问题:

  1. 线程阻塞:主线程在 get() 处被阻塞
  2. 资源浪费:CPU 在等待期间无法执行其他任务

回调注册通过非阻塞通知机制解决这些问题:

ListenableFuture<String> future = executor.submit(task);
Futures.addCallback(future, new FutureCallback<String>() {public void onSuccess(String result) {// 任务完成后自动执行processResult(result);}
});
// 主线程继续执行其他任务

JVM 运行流程详解

以下通过一个完整的订单处理系统示例,展示回调注册在 JVM 中的执行流程:

import com.google.common.util.concurrent.*;
import java.util.concurrent.*;public class OrderSystem {// 1. 创建可监听线程池private static final ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(2));public static void main(String[] args) {System.out.println("【主线程】启动订单处理系统");// 2. 提交订单处理任务ListenableFuture<OrderResult> future = processOrder("ORDER-101");// 3. 注册回调函数Futures.addCallback(future, new FutureCallback<OrderResult>() {@Overridepublic void onSuccess(OrderResult result) {System.out.println("【回调线程】订单处理成功: " + result.orderId());System.out.println("【回调线程】库存更新: " + result.stock());}@Overridepublic void onFailure(Throwable t) {System.err.println("【回调线程】订单处理失败: " + t.getMessage());}}, executor);// 4. 主线程继续执行其他任务System.out.println("【主线程】继续处理其他业务");processOtherTasks();// 5. 关闭线程池executor.shutdown();}// 模拟订单处理private static ListenableFuture<OrderResult> processOrder(String orderId) {System.out.println("【任务线程】开始处理订单: " + orderId);return executor.submit(() -> {// 模拟耗时操作Thread.sleep(1000);System.out.println("【任务线程】订单处理完成: " + orderId);return new OrderResult(orderId, new Random().nextInt(100));});}// 模拟其他任务private static void processOtherTasks() {System.out.println("【主线程】执行其他业务逻辑");// 模拟其他工作try { Thread.sleep(500); } catch (InterruptedException e) {}}// 领域模型record OrderResult(String orderId, int stock) {}
}

JVM 运行流程分析

阶段1:初始化(主线程)

主线程 JVM 加载类 创建线程池 提交订单任务 注册回调函数 执行其他任务 主线程 JVM
  1. JVM 加载 OrderSystem
  2. 主线程创建监听线程池(2个工作线程)
  3. 调用 processOrder() 提交任务
  4. 注册回调函数(但尚未执行)
  5. 主线程继续执行 processOtherTasks()

阶段2:异步任务执行(工作线程)

http://www.lryc.cn/news/581404.html

相关文章:

  • 如何使用backtrace定位Linux程序的崩溃位置
  • Python练习Day1
  • 【C语言刷题】第十一天:加量加餐继续,代码题训练,融会贯通IO模式
  • 双倍硬件=双倍性能?TDengine线性扩展能力深度实测验证!
  • 类(JavaBean类)和对象
  • BM6 判断链表中是否有环(牛客)
  • Linux安装java后没法运行
  • 西门子PLC博图软件学习(一)
  • 手写 Vue 中虚拟 DOM 到真实 DOM 的完整过程
  • .NET9 实现排序算法(MergeSortTest 和 QuickSortTest)性能测试
  • LinkedList 链表数据结构实现 (OPENPPP2)
  • 前端面试专栏-算法篇:18. 查找算法(二分查找、哈希查找)
  • AI智能体革命:从对话机器到自主决策的进化之路 **——当AI长出“手和脑”,一场人机协作范式转移正在发生
  • AI小智项目全解析:软硬件架构与开发环境配置
  • 图灵完备之路(数电学习三分钟)----解码器
  • Pytest 测试发现机制详解:自动识别测试函数与模块
  • 理想汽车6月交付36279辆 第二季度共交付111074辆
  • 比较两个csv文件的内容是否一致
  • Python 机器学习核心入门与实战进阶 Day 3 - 决策树 随机森林模型实战
  • HTML初学者第三天
  • centos 7.6安装mysql8
  • 基于大模型的肾积水全周期预测与诊疗方案研究报告
  • 03每日简报20250705
  • Qt开发:QListWidget的介绍和使用
  • java整合itext pdf实现自定义PDF文件格式导出
  • 画笔的进化:生成式AI与艺术创造力的范式革命
  • 完成ssl不安全警告
  • 数据结构:数组:二分查找(Binary Search)
  • 用 Turbo Vision 2 为 Qt 6 控制台应用创建 TUI 字符 MainFrame
  • Java-继承