虚拟线程应该很快消亡吗?

ben*_*ush 6 java multithreading project-loom virtual-threads java-21

JDK 开发人员建议永远不要池化虚拟线程,因为创建和销毁虚拟线程的成本非常低。我对池的想法有点困惑,因为池通常意味着两件事:

  1. 资源应该被重复利用
  2. 资源在发布之前将有很长的生命周期

我知道 JDK 开发人员希望我们永远不要重用虚拟线程,而生命周期问题让我感到困惑,因为如果有多个虚拟线程的生命周期与应用程序本身一样长,那么听起来可能像是没有重用的池化。

那么,虚拟线程是否应该快速死亡,或者具有较短的有界生命周期,或者多个虚拟线程阻塞、偶尔被唤醒以处理某些任务并且具有非常长的生命周期是否可以?

Bri*_*etz 8

对象被池化有几个主要原因。

  1. 创建或销毁它们的成本很高。池化意味着您可以通过多次使用来分摊这些成本。

  2. 它们消耗您想要管理其消耗的有限资源。池化意味着您可以通过对池设置限制来限制资源消耗。

这两个考虑因素都适用于平台线程;创建它们的成本很高,并且会消耗大量内存。如果为每个任务创建一个平台线程,则很容易耗尽内存。

请注意,池化本身很少有好处;充其量,它比替代方案(例如无界线程创建)更好。已使用的对象通常比新对象更糟糕,因为它们可能具有先前使用的剩余状态(例如孤立的线程)ThreadLocal值)。

这些考虑因素都不适用于虚拟线程。

然而,在虚拟线程中运行的代码可能需要使用有限的资源,例如数据库连接。在这些情况下,您需要管理这些资源的消耗,例如池化连接,或使用信号量来限制某种类型的任务可以同时运行的数量。但这些考虑因素都不支持池化虚拟线程。