当前位置: 首页 > 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.dtcms.com/a/267692.html

相关文章:

  • 基于matlab的二连杆机械臂PD控制的仿真
  • 2025年5月-植物水分吸收和运输优化算法water uptake and transport-附Matlab免费代码
  • 数字地和模拟地
  • 使用 C++/OpenCV 和 MFCC 构建双重认证智能门禁系统
  • 白皮解读——173页数据安全治理白皮书5.0【附全文阅读】
  • 灵活应对市场波动的智能运营中枢​
  • leetcode918.环形子数组的最大和
  • Spark SQL架构及高级用法
  • Java Go SDK 管理工具与最佳实践
  • 【汇编逆向系列】九、函数传参之结构体 - SHL、SHR指令,小型结构体参数和返回值
  • 《深度剖析:5G网络切片如何精准保障不同业务QoS需求》
  • PHP语法基础篇(九):正则表达式
  • 本机上搭一个HTTPS网站用什么工具?.NET self host支持吗?
  • Redis--黑马点评--达人探店功能实现详解
  • C++ 11中lock_guard和unique_lock的区别
  • 初识Linux:Linux开发工具gcc/g++和gdb以及Makefile的使用
  • Python小工具之PDF合并
  • Redux 扩展与标准化模板方案
  • LINUX75 LAMP
  • 字节一面整理
  • C++ 模板参数匹配、特化
  • 智能监控算法助力工厂高温高效管理
  • 淘系怎么做?
  • hiredis window之RFDMap
  • 基于大模型的肾积水全周期预测与诊疗方案研究报告
  • 如何使用backtrace定位Linux程序的崩溃位置
  • 【STM32】定时器中断 + 含常用寄存器和库函数配置(提供完整实例代码)
  • 洛谷 P11967 [GESP202503 八级] 割裂-普及+/提高
  • 百度文心 4.5 大模型详解:ERNIE 4.5 Technical Report
  • 水下航行器外形之变体式与回转体的区别