背景
JEP(JDK Enhancement Proposals)推进
将虚拟线程引入Java 平台。虚拟线程是轻量级线程,可以显著减少编写、维护和观察高吞吐量并发应用程序的工作量
使以简单的每个请求线程风格编写的服务器应用程序能够以接近最佳的硬件利用率进行扩展
使使用 java.lang.Thread API 的现有代码能够以最小的更改采用虚拟线程
使用现有 JDK 工具轻松进行虚拟线程故障排除、调试和分析
2022-09-20 Java19发布, virtual threads作为preview功能发布 https://openjdk.org/jeps/425
2023-03-21 Java20发布, virtual threads作为second preview预览功能发布 https://openjdk.org/jeps/436
2023-09-19 Java21(LTS)发布, virtual threads正式发布 https://openjdk.org/jeps/444
Loom
Loom 是一个OpenJDK的项目,旨在探索、孵化和交付构建在其之上的 Java VM 功能和 API,以支持 Java 平台上易于使用、高吞吐量的轻量级并发和新的编程模型
主要包含2部分
Virtual threads
Structured concurrency
https://wiki.openjdk.org/display/loom
Structured Concurrency 结构化并发
通过引入结构化并发 API 来简化并发编程。结构化并发将在不同线程中运行的相关任务组视为单个工作单元,从而简化错误处理和取消、提高可靠性并增强可观察性
2022-09-20 Java19发布, structured concurrency作为Incubator开始孵化 https://openjdk.org/jeps/428
2023-03-21 Java20发布, structured concurrency作为Second Incubator https://openjdk.org/jeps/437
2023-09-19 Java21(LTS)发布, structured concurrency作为preview功能发布 https://openjdk.org/jeps/453
对开发的影响
框架开发or应用开发
对于使用线程或并行的库和框架来说,将是一件大事。库作者能够实现巨大的性能和可扩展性提升,同时简化代码库,使其更易维护。大多数使用线程池和平台线程的 Java 项目都能够从切换至虚拟线程的过程中受益,候选项目包括 Tomcat、Undertow 和 Netty 这样的 Java 服务器软件,以及 Spring 和 Micronaut 这样的 Web 框架
不会对普通的 Java 开发人员产生太大的影响,因为这些开发人员可能正在使用某些库来处理并发的场景。但是,在一些比较罕见的场景中,比如你可能进行了大量的多线程操作但是没有使用库,那么这些特性就是很有价值的了。虚拟线程可以毫不费力地替代你现在使用的线程池。根据现有的基准测试,在大多数情况下它们都能提高性能和可扩展性
https://www.infoq.cn/article/wg5qybla1ps222larj3y
库依赖版本
https://github.com/spring-projects/spring-framework/wiki/Spring-Framework-Versions
VS 反应式编程
对于应用开发者来说,Virtual Threads 和 Reactive 的目的一样,都是对于IO密集型服务,通过提高CPU的使用率来实现提高服务的吞吐量
在Virtual Threads没有作为JEPS正式提出前,知乎上就有一些讨论,大部分人认为 Virtual Threads 这样将负担交给JVM的方式更好,而不是自己组织Reactive代码写回调
Oracle的Reactive驱动ADBA停止开发,现在使用较多的MySQL Reactive驱动是Spring主导开发的R2DBC
loom的tech lead认为正确的方向是”Code like sync, works like async”
其他语言的coroutine
go的goroutine
Go所有线程都是”虚拟线程”
Java兼容GUI、Android,Virtual Thread是Thread的子类,支持手动指定Virtual Thread pin到 Platform Thread的逻辑
kotlin的coroutine
Coroutines | Kotlin Documentation - kotlinlang.org
参考文章