Project Loom EA抢先体验版本发布


Build 19-loom+5-429 (2022/4/4):此构建基于 JDK 19的不完整版本。
与之前的版本相比,没有任何API变化。有很多 
有很多变化,特别是在GC和运行时领域有很多变化,有几个重要的修正。
特别是在GC和运行时领域有许多变化,并有几个重要的修正。该版本 包括Doug Lea最近在并发兴趣列表上宣布的ForkJoinPool的更新。
最近宣布的ForkJoinPool的更新--这个更新提高了 在消息传递等情况下的性能。

下载:


注意:
  • 早期访问(EA)的功能可能永远不会进入一般可用性(GA)版本。
  • EA功能可能在任何时候被改变或删除。
  • EA构建的存在并不意味着被测试的功能会出现在任何特定的GA版本中。
  • 支持的平台和GA构建的包装选项可能与EA构建的不同。
  • EA构建的测试水平与Oracle测试GA构建的水平不一样。EA构建的目的是为了收集反馈。用于任何其他目的的风险由您自己承担。
  • EA 构建可能缺少 GA 构建或其他 OpenJDK 项目中的安全漏洞修复。
  • Oracle 不为 EA 构建提供支持。

虚拟线程是java.lang.Thread的一个实例,它不与特定的操作系统线程相联系。
相比之下,以前的平台线程是以传统方式实现的java.lang.Thread的一个实例,作为操作系统线程的一个薄的包装。

支持每次请求一个线程风格的应用代码现在可以在请求的整个过程中都在虚拟线程中运行,但虚拟线程只在CPU上执行计算时消耗一个操作系统线程。
其结果是与异步风格相同的可扩展性,只是它是以透明方式实现的。
当在虚拟线程中运行的代码调用java.* API中的阻塞I/O操作时,运行时会执行一个非阻塞的操作系统调用,并自动暂停虚拟线程,直到以后可以恢复。
这对Java开发者来说,虚拟线程只是创建成本低且几乎无限多的线程。硬件利用率接近最佳,允许高水平的并发,因此,高吞吐量,而应用程序仍然与Java平台的多线程设计及其工具相协调。

虚拟线程的革命性
虚拟线程很便宜,而且数量很多,因此不再需要被放入集中的线程池:应该为每个应用任务创建一个新的虚拟线程。
因此,大多数虚拟线程都是短命的,而且调用栈很浅,只执行一次HTTP客户端调用或一次JDBC查询。
相比之下,传统平台线程是重量级和昂贵的,因此往往必须是池化的。它们往往寿命很长,有很深的调用栈,并在许多任务之间共享。

总之,虚拟线程保留了与Java平台设计相协调的可靠的每请求线程风格,同时优化了硬件的利用。
使用虚拟线程不需要学习新的概念,尽管它可能需要你改变之前为应对传统线程高成本而养成的习惯。(如不再需要线程池,Tomcat内置common-pool线程池不再需要)
虚拟线程不仅能帮助应用开发者-:还能帮助框架设计者提供易于使用的API,这些API与平台的设计兼容,同时又不影响扩展性。
 
网友讨论
有.NET网友认为:在 .NET 中遇到了Mono和线程池死锁问题,而这个 Java 解决方案非常完美。

那么为什么不将async和await与.NET 一起使用呢?实现的相同功能目标?也就是说async/await与虚拟线程有啥区别?
在实践中 async/await 与绿色线程(虚拟线程)非常相似,它们有效地完成了相同的基本目标,但是 async/await 的问题是……一旦你开始使用它们,它就会污染几乎所有它接触到的东西(非常值得注意在 Javascript / Typescript 中)。
虚拟线程更方便一点,因为当您需要开始使用它们时,您不会将整个代码库颠倒过来(特别是据我所知,您只需分配一个运行虚拟线程的虚拟线程池)。(虚拟线程侵入性很小,使用 async/await 过于强势,代码需要围绕它为核心转,破坏了代码本身的业务逻辑性或原本实现的功能思路),参考:你的函数是什么颜色?