当前位置:Java -> 虚拟线程的复活:揭开它们从JDK 1.1到JDK 21的演变之旅

虚拟线程的复活:揭开它们从JDK 1.1到JDK 21的演变之旅

几个月前,我写了一篇文章,讨论了虚拟线程在JDK 21中的首次亮相及其在实现请求级别线程模式中的作用。您可以点击这里查看完整文章。

在与读者的互动中,我发现了一个有趣的历史细节:虚拟线程在早期的JDK 1中就曾经引入过,后来又被逐渐淘汰

坦率地说,对我来说这是个新鲜事,因为我的Java之旅始于2000年代初。我的好奇心被激起,我着手寻找初次引入和后来淘汰虚拟线程的细节,以解释它们是如何在JDK 21中有了显著复兴。

在本文中,我将分享我在探索过程中发现的见解。

绿色线程,也被称为虚拟线程或用户级线程,最初被用于早期的Java版本,包括JDK 1.0,用于并发处理。这些线程由用户级库或运行时系统管理,而不是基础操作系统。它们旨在提供一种轻量级的并发处理方式,而不依赖于操作系统的本机线程。

thread management

然而,有几个原因导致绿色线程在JDK 1.0后被淘汰,转而采用本机线程:

  1. 平台独立性: Java的“一次编写,到处运行”的承诺在绿色线程上难以实现。绿色线程高度依赖于底层运行时系统,使得维护平台独立性变得困难。
  2. 有限的并发性: 绿色线程不适用于需要真正并行处理的应用程序,尤其是在多核处理器上。它们无法充分利用现有的硬件资源。
  3. 可伸缩性: 绿色线程无法充分利用现代硬件,因为它们依赖于单一进程处理所有线程。而另一方面,本机线程或平台线程可以分布在多个进程中。
  4. 阻塞I/O: 绿色线程无法有效地处理阻塞I/O操作。当绿色线程在I/O上阻塞时,通常会阻塞进程中的所有其他线程,导致性能下降。
  5. 可移植性: 使用绿色线程的应用程序在不同平台上的行为可能有所不同,这使得确保在各种系统上行为一致变得困难。
  6. 操作系统支持: 随着Java的发展,本机线程的使用在多线程处理方面变得更加实际,因为操作系统对多线程的支持得到改善。本机线程具有更好的性能和现代系统的兼容性。

由于这些限制,Java转向使用本机线程以提高性能、可伸缩性和可移植性。这一改变使得Java对并行编程和并行编程提供更好的支持,使得Java更适用于更广泛的应用程序和系统。

JDK 21中,Java引入了一个基于虚拟线程的新并发模型,可以看作是绿色线程的重新想象版本。这些虚拟线程旨在解决绿色线程在早期Java版本中所面临的一些挑战。它们虽然与绿色线程相似,但设计时考虑了现代解决方案。以下是它们如何解决所提到的挑战:

  1. 平台独立: 虚拟线程保持平台独立性。它们被集成到Java平台本身,不依赖外部用户级库。这确保了“一次编写,到处运行”的原则得到遵守。
  2. 有限的并发性: 虚拟线程可以提供比绿色线程更多的并发性。它们被设计用于充分利用现代多核处理器,从而实现更好的并行性和性能。
  3. 可伸缩性: 虚拟线程可以在多个处理器和核心之间进行高效调度,使其适用于具有高可伸缩性的现代硬件。
  4. 阻塞I/O: 虚拟线程可以有效处理阻塞的I/O操作。当虚拟线程在I/O上阻塞时,它会自动挂起而不会影响其他虚拟线程的执行。这提高了在具有I/O限制的应用程序中的性能。
  5. 可移植性: 虚拟线程的行为在不同平台上是一致的,确保使用虚拟线程的应用程序将具有可预测和可靠的性能。
  6. 操作系统支持: JDK 21被设计为在必要时与本机线程一起工作,确保与现代操作系统的良好兼容性。它在虚拟线程与本机线程之间取得平衡,以优化性能和资源利用。

虽然虚拟线程从绿色线程中汲取灵感,但它们并不是对旧的绿色线程模型的完全逆转。相反,它们结合了绿色线程和本机线程的优点,提供了更多样化和高效的并发模型。这种方法允许Java更好地适应当今的硬件,并解决了语言早期版本中绿色线程所面临的挑战。

推荐阅读: 73.如何使用AQS自定义同步器?

本文链接: 虚拟线程的复活:揭开它们从JDK 1.1到JDK 21的演变之旅