2年前 (2022-07-18)  Java系列 |   抢沙发  498 
文章评分 0 次,平均分 0.0

JEP 425:虚拟线程 Virtual threadshttps://openjdk.org/jeps/425)以JDK 19作为预览API。虚拟线程Project Loom的一部分,该项目自2017年以来一直在制作中。该项目旨在通过让开发人员使用熟悉的API编写和维护并发应用程序,并更高效地使用硬件资源,提高Java中的并发性能。

虚拟线程

动机

Java中的并发由线程处理。每个线程独立于其他线程执行其任务,并提供堆栈跟踪,因此很容易调试或分析它们。有两种处理线程的方法。第一个是每个请求的线程:一个线程在其整个持续时间内专用于一个请求。这样的设计很容易编写、处理和调试,但我们不能拥有太多。线程是作为操作系统线程的包装器实现的,成本很高。因此,为了有效地扩展应用程序,开发人员有时会使用第二种方法——异步编程。在这种情况下,线程不会保留请求,而是返回到池来处理其他请求。这种请求处理风格允许在不增加线程数的情况下进行更多的操作,但会使编写代码和理解应用程序的行为变得困难。

解决方案

虚拟线程是一种机制,使开发人员能够保持每个请求编程的线程清晰性,并显著增加线程数。在代码的整个生命周期中,虚拟线程不与操作系统线程绑定。相反,它们仅在执行计算时捕获操作系统线程,即多个虚拟线程可以共享一个操作系统线程。

虚拟线程既便宜又丰富。在一个程序必须同时执行10000个任务的情况下,只能创建200个操作系统线程,这意味着吞吐量将为每秒200个任务。但是代码可以轻松创建10000个虚拟线程,因此吞吐量将为每秒10000个任务。任务的数量可以进一步增加,对于虚拟线程来说,这无关紧要。因此,可以通过优化硬件利用率有效地扩展应用程序。

同时,虚拟线程易于调试、分析和执行。JDK调试器和概要文件可以单步执行虚拟线程,分析堆栈跟踪,并将代码事件和正确的线程相关联。由于虚拟线程是JDK的一部分,它使用自己的调度程序ForkJoinPool来调度线程并运行代码,而不需要重写代码。此外,不需要虚拟线程池,因为线程池用于昂贵的资源,并且虚拟线程廉价且丰富。

受影响区域

以下JDK组件将使用此JEP进行更新:

  • java.lang.Thread
  • Thread-local variables
  • java.util.concurrent
  • Networking
  • java.io
  • Java Native Interface (JNI)
  • Debugging (JVM TI, JDWP, and JDI)
  • JDK Flight Recorder (JFR)
  • Java Management Extensions (JMX)
  • java.lang.ThreadGroup

此外,在JDK 19发布之前,将进行多项测试,以确保没有意外的倒退或对性能的影响。与提案相关的主要风险与主API引入的更改导致的兼容性有关。关键风险和假设列在JEP页面上。

虚拟线程将与结构化并发(structured concurrency)配合使用,后者是一种新的API,用于创建和管理线程,并在线程之间建立清晰的关系。

Project Loom的价值

JEP 425是将Project Loom集成到JDK中的重要一步。该项目将使所有Java开发人员受益,因为它使轻量级可扩展并发成为JVM的一部分,而不需要额外的库或框架。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2709.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册