
协程与线程的基本概念区别
Java 已经引入了协程的概念,协程在 I/O 密集型场景中可比传统线程提升 10-70 倍的吞吐量。这种性能飞跃主要源于协程的用户态调度、极低的内存占用和高效的上下文切换机制。
协程 (Coroutine) 与线程 (Thread) 在 Java 中代表两种不同的并发执行模型,它们的核心区别体现在调度机制、资源占用和执行方式上。
在调度方式上,线程由操作系统内核调度,采用抢占式机制,线程切换需要从用户态进入内核态,涉及复杂的上下文保存和恢复,每次切换耗时约 1-10 微秒。而协程完全在用户态执行和调度,采用协作式机制,协程在遇到阻塞操作时主动挂起,将 CPU 让给其他协程,切换成本降至 0.1-1 微秒,开销仅为线程的 1/10 至 1/100。
资源占用方面差异显著:传统 Java 线程在 64 位 Linux 系统上默认栈大小为 1MB,加上内核数据结构额外消耗约 16KB 内存。相比之下,协程的栈空间通常在几百字节到几 KB 之间,内存效率提升约 1000 倍。这意味着在同样内存条件下,协程可支持的并发量远超线程,如 Project Loom 测试显示单机可支撑百万级协程,而传统线程通常受限于数千个的并发量。
阻塞影响上也存在本质区别:线程阻塞(如 I/O 操作)会导致整个线程处于等待状态,无法处理其他任务,造成 CPU 资源浪费。协程则在遇到阻塞操作时主动挂起,释放线程资源,允许线程继续执行其他协程,大大提高了 CPU 利用率。例如在 Web 服务器场景中,协程可在等待数据库响应时让出线程,处理其他 HTTP 请求,而线程模型则需为每个请求分配独立线程。
并发规模方面,协程支持更高的并发级别:协程可轻松创建数万个甚至百万个实例,而传统线程模型在高并发时会面临内存耗尽和调度开销过大的问题。例如,材料显示 100 万个协程可正常运行,而同等数量的线程会导致系统直接卡死。
一、Java 虚拟线程的演进历史
| 版本 | 状态 | 主要特性 |
|---|---|---|
| Java 19 | 预览功能 | 首次引入虚拟线程(JEP 425) |
| Java 20 | 第二次预览 | 优化 API 和性能(JEP 436) |
| Java 21 (LTS) | 正式发布 | 成为标准功能(JEP 444) |
| Java 22+ | 持续优化 | 性能提升和功能增强 |
二、什么是虚拟线程
核心概念
// 传统线程(平台线程)
Thread platformThread = new Thread(() -> {
// 直接映射到操作系统线程
});
platformThread.start();
// 虚拟线程
Thread virtualThread = Thread.ofVirtual()
.name()
.start(() -> {
});


