虚拟线程详解 - Java 一口小知识
Billy Korando,2023 年 10 月 30 日
虚拟线程是 Project Loom 中期待已久的核心部分,现已成为 Java 21 中的一项最终功能。那么,为什么虚拟线程让如此多的 Java 开发人员感到兴奋呢?让我们来看看吧!
资源有限
在 JVM 上,所有代码都在线程上执行。从历史上看,Java 中的线程一直是一个相对重量级的对象,因为线程与操作系统提供的底层线程相关联。
对于只需要几十个线程的应用程序来说,这不会构成重大问题。但是,通常遵循每个请求一个线程模型的 Web 应用程序可能会快速使用所有可用线程。
空闲资源
如果线程得到充分利用,这并不一定是个问题;但是,许多 Web 应用程序的线程通常会在等待来自外部服务(例如数据库或调用其他 Web 服务)的响应时花费大量时间处于空闲状态。
这可能会导致应用程序处于一种不太理想的状态,即已达到其线程分配上限,但 CPU 利用率仍然很低。
拆分线程
Project Loom 旨在通过将线程拆分为两个不同的概念来解决此问题。
平台线程是 java.lang.Thread
的实例,并且是平台提供的操作系统线程的包装器。
虚拟线程扩展 java.lang.Thread
,但在平台线程之上运行,并且不链接到底层操作系统线程。
调度线程
JDK 可以通过监视阻塞操作(例如 BlockingQueue.take()
)和侦听套接字上接收的字节来调度和取消调度虚拟线程。
默认情况下,虚拟线程的调度由 java.util.concurrent.ForkJoinPool
处理。它以 FIFO 模型运行,并且具有与可用平台线程数相当的并行容量,而平台线程数本身基于可用处理器的数量。这些行为和值是可配置的。
维护上下文和调试
虚拟线程不绑定到平台线程,并且可以根据需要在平台线程之间自由移动。但是,上下文、线程局部值、堆栈跟踪等会保留在虚拟线程中。虚拟线程允许 Java 开发人员获得响应式编程的许多好处,同时保持命令式编程提供的编写和调试的简便性。
其他读物
Inside Java 上的 Project Loom 文章
编码愉快!