Java21的虚拟线程来了
1、什么是平台线程?
平台线程是作为操作系统 (OS) 线程的薄包装器实现的。平台线程在其底层 OS 线程上运行 Java 代码,并且平台线程在其整个生命周期内捕获其 OS 线程。因此,可用的平台线程数量受限于 OS 线程的数量。
平台线程通常具有较大的线程堆栈和由操作系统维护的其他资源。它们适合运行所有类型的任务,但资源可能有限。
2、什么是虚拟线程?
与平台线程类似,虚拟线程也是 java.lang.Thread。但是,虚拟线程并不与特定的操作系统线程绑定。虚拟线程仍在操作系统线程上运行代码。但是,当虚拟线程中运行的代码调用阻塞 I/O 操作时,Java 运行时会暂停虚拟线程,直到可以恢复为止。与暂停的虚拟线程关联的操作系统线程现在可以自由地执行其他虚拟线程的操作。
虚拟线程的实现方式与虚拟内存类似。为了模拟大量内存,操作系统会将较大的虚拟地址空间映射到有限的 RAM 中。同样,为了模拟大量线程,Java 运行时会将大量虚拟线程映射到少量 OS 线程中。
与平台线程不同,虚拟线程通常具有浅层调用堆栈,仅执行一次 HTTP 客户端调用或一次 JDBC 查询。尽管虚拟线程支持线程局部变量和可继承的线程局部变量,但您应谨慎考虑使用它们,因为单个 JVM 可能支持数百万个虚拟线程。
虚拟线程适合运行大部分时间处于阻塞状态(通常等待 I/O 操作完成)的任务。但它们不适合长时间运行的 CPU 密集型操作。
3、为什么要使用虚拟线程?
在高吞吐量并发应用程序中使用虚拟线程,尤其是那些包含大量并发任务且大部分时间都在等待的应用程序。服务器应用程序是高吞吐量应用程序的示例,因为它们通常处理许多执行阻塞 I/O 操作(例如获取资源)的客户端请求。
虚拟线程并不是更快的线程;它们运行代码的速度并不比平台线程快。它们存在的目的是为了提供规模(更高的吞吐量),而不是速度(更低的延迟)。
4、如何创建并运行虚拟线程?
Thread.ofVirtual();
Executors.newVirtualThreadPerTaskExecutor();
5、虚拟线程的底层原理是什么样的?
Java21虚拟线程指的是 Project Loom 中的 VirtualThreads,这是 Java 平台未来版本中的一个特性,用于提供轻量级的高度可扩展的线程。21虚拟线程是一种更高效的线程模型,它们由Project Loom 中的 Fibers 实现,旨在降低线程的创建和调度成本。
Java21的虚拟线程的工作原理如下:
(1)、用户态线程:虚拟线程是一种用户态线程,由 Java 虚拟机(JVM)直接管理而不依赖于操作系统线程。这意味着在 JVM 内部可以创建大量的虚拟线程而无需依赖于底层操作系统线程。
(2)、调度与调用堆栈:虚拟线程由协作式调度来管理,它们不需要像传统线程那样依赖于操作系统的抢占式调度。这些线程的上下文切换开销很低,因为它们使用的调用堆栈非常小,允许更高效的线程创建和调度。
(3)、Fiber 对象:在 Project Loom 中,虚拟线程通过 Fiber 对象来表示。Fiber 可以被看作是一种轻量级的执行单元,它可以像线程一样执行任务,但是比传统线程更节省资源。
(4)、用户态阻塞:虚拟线程在执行过程中遇到阻塞时,可以将自已挂起,让出 CPU,而不会占用额外的操作系统线程。这样可以避免传统线程阻塞时创建新的线程或进入等待状态,降低了系统资源消耗
(5)、利用异步IO:虚拟线程可以更好地利用异步IO操作,提高并发性能,因为它们能更轻松地处理大量的IO请求而不会阻塞线程。总的来说,虚拟线程的工作原理主要在于 JVM 内部实现了一种高效的协作式调度机制,通过Fiber 对象管理和调度大量轻量级的用户态线程,以降低线程创建、调度和管理的开销,并提高系统的并发性能。