一、前言
协程(Coroutine) 是一种轻量级的并发编程模型 ,允许在单线程内通过协作式多任务调度实现并发。 由用户代码显式控制(用户态调度 而非操作系统内核调度),避免了线程上下文切换的开销,适合高并发、I/O密集型任务。 协程可以理解为一种轻量级线程 ,它允许在执行中暂停并在之后恢复执行,而无需阻塞线程。
二、协程与线程的区别
三、Java对协程的支持
1.传统局限
Java 标准线程(java.lang.Thread)基于操作系统线程,资源消耗大,难以支撑大规模并发。 开发者通常依赖线程池 缓解,但无法彻底解决开销问题。
2.Project Loom(核心解决方案)
虚拟线程(Virtual Threads) :JDK 19+ 引入的轻量级协程实现(JEP 425),由JVM调度,映射到少量OS线程上运行。特点 :
语法与传统线程兼容(基于Thread类),易于迁移。 创建和切换开销极低,支持百万级并发。 适用于阻塞型任务(如网络I/O),自动挂起/恢复。 总结 :
Java 一开始并没有原生支持协程。 但在 Java 19 中通过 Project Loom 引入了虚拟线程(VirtualThreads),最终在 Java21 中确认 。它提供了类似协程的功能。 虚拟线程可以被认为是 Java 对协程的一种实现 ,虽然实现原理与传统协程略有不同,但它实现了高效并发。
3.代码示例
try ( var executor = Executors . newVirtualThreadPerTaskExecutor ( ) ) {
executor. submit ( ( ) -> {
System . out. println ( "Hello, Virtual Thread!" ) ;
} ) ;
}
4.历史方案(不推荐)
早期通过第三方库(如Quasar、Kilim)实现协程,需字节码修改或特殊注解,维护成本高。
四、总结
协程优势 :轻量级、低开销、高并发,适合I/O密集型任务 。Java现状 :通过 Project Loom 的虚拟线程原生支持协程,JDK 19+ 可体验,JDK 21 正式发布。未来趋势 :虚拟线程将显著简化Java高并发编程,成为替代传统线程池的重要选择。