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

Java异步编程与资源管理笔记

最近从业务层的这段代码,突然对异步线程和协程感兴趣,查阅资料后,弄了个笔记保存一下方便日后查阅
原来的业务代码块:
/** * 异步延迟删除员工缓存 * * @param keys */ public void asyncDelayDeleteCategoryCache(String... keys) { CompletableFuture.runAsync(() -> { try { Thread.sleep(500); for (String key : keys) { redisCache.delete(key); log.debug("清理分类缓存:{}", key); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); log.warn("清理分类缓存线程被中断:{}", e.getMessage()); } }); }

核心演进:从线程到协程

  1. 原始时代(Thread)
  • 特点:直接创建线程执行任务。
  • 痛点:线程创建成本高,缺乏生命周期管理(难以获取结果、取消任务)。
  • 场景:仅适用于简单场景,不适用于高并发应用。
  1. 线程池与Future(Java 5)
  • 核心:引入线程池(ExecutorService)和 Future 接口。
  • 机制Future 作为“任务凭据”,支持查询状态、阻塞等待结果或取消任务。
  • 价值:解决了线程资源浪费问题,但缺乏链式处理能力,易导致阻塞或轮询。
  1. CompletableFuture(Java 8)
  • 核心:实现 CompletionStage 接口,支持回调注册(如 thenApplythenAccept)。
  • 机制:任务完成后自动触发后续逻辑,实现非阻塞异步流水线。
  • 价值:摆脱了 Future 的阻塞等待,简化了异步编程复杂度。

概念辨析:线程、Future与协程

维度 操作系统线程 Future 协程(虚拟线程)
本质 系统资源(内核级) 任务契约/接口 用户态轻量级线程
调度者 操作系统内核(抢占式) 线程池(协作式分配) 语言运行时(协作式)
资源模型 1:1(1个Java线程↔1个内核线程) 依赖线程池配置 M:N(多协程复用少量内核线程)
核心痛点 栈内存占用大(MB级),上下文切换开销高 阻塞导致线程饥饿,需手动管理线程池 需运行时支持(Java 21+原生支持)
  • Future的本质CompletableFuture.runAsync 本质是基于线程池的异步。任务提交至线程池(默认 ForkJoinPool.commonPool()),由工作线程执行,Future 仅管理任务状态。
  • 协程的本质:协程是轻量级线程。Java 21的虚拟线程(Virtual Threads)在I/O阻塞时自动“挂起”,载体线程可执行其他任务,单线程可支撑数千协程,极大提升吞吐量。

JVM与垃圾回收(GC)

任务生命周期与GC的关系

  • 提交阶段:任务对象被放入线程池工作队列,队列持有强引用,GC不会回收。
  • 执行阶段:工作线程从队列取出任务,任务对象被线程栈引用。若任务引用大对象(如缓存数据),这些对象保持存活。
  • 完成阶段:任务执行完毕,线程栈帧清理,队列引用移除。任务对象变为不可达(垃圾)。
  • GC回收:短生命周期任务分配在新生代(Eden区),下一次Minor GC时快速清理。无需手动干预GC,但需避免线程池队列无限堆积导致内存溢出。

实践中的资源管理

  1. 线程池隔离原则
  • 风险:滥用默认线程池(commonPool)可能导致全JVM异步任务卡死(如耗时任务占满线程池)。
  • 最佳实践:为不同业务场景(缓存清理、短信发送)创建独立的有界线程池
  1. 异常处理原则
  • 风险:异步任务异常未捕获会被“吞掉”,可能导致任务对象因异常栈持有而延迟GC。
  • 最佳实践:通过 try-catchexceptionally() 显式处理异常。
  1. 协程时代的优化
  • 适用场景:I/O密集型应用(Web服务、微服务)。
  • 优势:虚拟线程轻量,可像创建对象一样创建,JVM自动调度,无需精细管理线程池大小。

总结

Java异步编程的演进本质是对线程资源的管理与编排能力的进化Future 是基于线程池的契约模型,而协程(虚拟线程)则是对线程资源的彻底解放。理解二者的关键在于:线程是昂贵的系统资源,协程是廉价的用户态调度。在GC层面,只要线程池配置合理、任务不堆积,内存回收是自动且高效的。

http://www.jsqmd.com/news/728670/

相关文章:

  • 告别默认‘滴滴’声!用Bluejay Configurator给你的穿越机电调定制专属开机BGM(附天空之城、JOJO等曲谱)
  • Pine64 StarPro64 RISC-V开发板:高性能与AI加速解析
  • 使用Taotoken后如何清晰查看API用量与成本分布
  • Day1 C与python输入输出语句区别
  • 魔兽争霸3帧率优化指南:如何通过开源工具WarcraftHelper突破60帧限制
  • VCS后仿保姆级避坑指南:从网表、SDF到lib库的完整配置流程
  • 思源宋体终极指南:7款免费商用字体快速上手与实战技巧
  • 2026年知网新算法下论文降AI收藏指南:降低AI率硬核手改技巧+降AI率工具实测 - 降AI实验室
  • CTP穿透式监管下,企业级量化系统如何设计订单与持仓管理模块?
  • 对话式数据可视化:用自然语言驱动Vega-Lite图表生成
  • 串口通信无线化方案与工业物联网应用
  • 超算小白避坑指南:用Slurm和Conda搞定深度学习环境(附常见错误排查)
  • 别让爬虫白嫖你的导航站了:纯免费,手把手实现加密字体防爬
  • 从零开始掌握LaserGRBL:开源激光雕刻软件的完整使用指南
  • 给你的STM32F103C8T6开发板“添砖加瓦”:ESP8266联网、OLED显示与蓝牙控制实战
  • 每个程序员都该学习的5种开发语言
  • 五指灵巧手有哪些技术要点?2026年专业五指灵巧手厂商甄选 - 品牌2026
  • 2026年深圳初升高品牌排行:聚焦民办高中核心竞争力 - 优质品牌商家
  • 2026年我的效率工具箱:5个每天必用的软件
  • 从账单明细看 Taotoken 计费透明性带来的管理便利
  • 2026铝皮保温玻璃棉品牌排行:铝皮保温保护层、铝皮保温加工、铝皮保温厂家、铝皮保温外壳、铝皮保温安装报价、铝皮保温施工费用选择指南 - 优质品牌商家
  • 如何彻底解决ComfyUI的GPU显存泄漏问题
  • RimSort终极指南:轻松管理《环世界》模组,告别加载冲突烦恼
  • 突破性百度网盘直链解析工具:5分钟告别限速烦恼,实现高速下载
  • 微型夹爪精密设备配套如何甄选厂家?2026年微型夹爪精密供应商推荐 - 品牌2026
  • Taotoken的API Key管理与访问控制功能在实际项目中的应用价值
  • 2026上海建筑电焊证报名机构TOP名录:上海建筑焊工考证地址/上海建筑焊工考证电话/上海建筑焊工证培训/上海建筑焊工证培训机构/选择指南 - 优质品牌商家
  • 2026年4月国内电力纺面料供应商综合排行 - 优质品牌商家
  • 2026河北外六角组合螺栓技术解析:河北不锈钢外六角组合螺丝/河北十字盘头组合螺钉/河北压铆螺钉/河北圆柱头内六角组合螺丝/选择指南 - 优质品牌商家
  • 对比直接使用厂商API体验Taotoken在接入便捷性上的优势