根据项目织机文档,虚拟线程的行为与普通线程一样,但成本几乎为零,并且能够将阻塞调用转换为非阻塞调用。
如果这是真的,那为什么它们是分开的东西?为什么不把它们设为默认值呢?有什么理由不使用它们吗?
最佳答案
这里确实有两个问题:1. 为什么虚拟线程不是默认的?和 2. 有没有理由不使用它们。
关于默认,Java 确实没有“默认”线程的概念。一旦虚拟线程到达,当您创建线程时,您必须指定您想要平台线程还是虚拟线程。那么问题就变成了为什么我们决定不自动用虚拟线程替换今天的线程(即让 new Thread()
创建一个虚拟线程)。答案很简单:它根本没有帮助,而且可能非常有害。这不会有帮助,因为虚拟线程的优势来自于创建大量虚拟线程的能力。如果您的应用程序今天创建了 N 个线程,那么将这 N 个线程转换为虚拟线程将一事无成。虚拟线程的扩展优势只会在您的应用程序创建 1000N 个线程时发挥作用,这意味着无论如何都需要对其进行更改(例如,将 Executors.newFixedThreadPool
替换为 Executors。 newVirtualThreadPerTaskExector
).这可能是有害的,因为虽然虚拟线程的语义几乎与平台线程相同,但它们并不完全向后兼容(有关详细信息,请参见 JEP 425)。
关于何时不使用虚拟线程的问题,有一些明显的例子。例如。当您的线程与 native 代码大量交互时, native 代码对虚拟线程一无所知,或者当您依赖于虚拟线程已更改的某些细节时,例如子类化 Thread
的能力。其他情况就不是那么清楚了。例如,CPU 密集型操作不会从拥有比 CPU 核心更多的线程中获益,因此它们不会从大量虚拟线程中获益,但这并不意味着它们会受到伤害。我们还没有准备好说用户应该默认选择虚拟线程,但我们很可能会做到这一点,因为我们更多地了解人们如何使用它们。
关于java - 项目机子: Why are virtual threads not the default?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71945866/