虚拟线程详解 - Java 一口小知识

虚拟线程是 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 开发人员获得响应式编程的许多好处,同时保持命令式编程提供的编写和调试的简便性。

其他读物

JEP 444 - 虚拟线程

Project Loom

Java 21 新功能:虚拟线程 #RoadTo21

Inside Java 上的 Project Loom 文章

编码愉快!