我正在浏览一些最近引入的公共 API,并偶然发现了 JDK 21+ 中的
Executors.newThreadPerTaskExecutor
。
创建一个执行器,为每个任务启动一个新线程。号码 Executor 创建的线程数量是无限的。
但是从某些参考文献中,我了解到,在虚拟线程之前,开发人员将被限制创建“有限数量的线程”。当然,对于虚拟线程,我们希望开发人员不必担心此类限制,但通过 newVirtualThreadPerTaskExecutor
进行创建无论如何都会提供可能需要的无限制执行器。我进一步引用JEP-444此外,
Executors.newThreadPerTaskExecutor(ThreadFactory)
和
创建一个ExecutorService 为每个任务创建一个新线程。这些方法Executors.newVirtualThreadPerTaskExecutor()
启用迁移以及与使用线程的现有代码的互操作性 池和 ExecutorService。 我想不出迁移会寻求使用
newThreadPerTaskExecutor
ThreadFactory
,现在可以轻松地用替换它
Thread.ofVirtual().name("vt-").factory()
任何新的创作都可以走newVirtualThreadPerTaskExecutor
的路线。我是否在这里遗漏了一些东西,或者这最终会成为一个被忽视的 API,其滥用程度超过其在迁移中的用处?
无法真正找到代码参考来研究这对当前文档的帮助,除了
newVirtualThreadPerTaskExecutor
内部调用它如下:
public static ExecutorService newVirtualThreadPerTaskExecutor() {
ThreadFactory factory = Thread.ofVirtual().factory();
return newThreadPerTaskExecutor(factory);
}
可以自给自足地写成:public static ExecutorService newVirtualThreadPerTaskExecutor() {
ThreadFactory factory = Thread.ofVirtual().factory();
return ThreadPerTaskExecutor.create(threadFactory);
}
您似乎正在深入研究 Java 并发中的一些高级概念,并探索 JDK 21+ 中虚拟线程的引入。让我们分解您的观点并解决您的问题:
Executors.newThreadPerTaskExecutor 与 newVirtualThreadPerTaskExecutor:
Executors.newThreadPerTaskExecutor
创建一个执行器,为每个任务启动一个新线程。这可能会导致创建无限数量的线程。JEP-443 中引入了 newVirtualThreadPerTaskExecutor
以支持虚拟线程。它创建一个行为类似于 newThreadPerTaskExecutor 的执行器,但它使用虚拟线程而不是本机线程。迁移和互操作性
:包含 newThreadPerTaskExecutor
背后的动机是为了促进依赖于线程池和 ExecutorService 的现有代码的迁移和互操作性。 通过提供此方法,开发人员可以轻松替换现有的实例 ExecutorService 由线程池支持,具有类似的执行器,为每个任务创建一个新线程。这在现有代码库严重依赖此类行为的某些迁移场景中可能很有用。用例和潜在的误用:
您正确地指出,随着虚拟线程的出现,开发人员不太可能需要无限数量的线程。虚拟线程是轻量级的,可以大量创建,而不会有资源耗尽的风险。 newThreadPerTaskExecutor 在实践中可能会减少使用频率,特别是当开发人员接受虚拟线程及其优势时。 但是,可能仍然存在需要或需要 newThreadPerTaskExecutor 行为的利基用例或特定场景。
内部实施
:newVirtualThreadPerTaskExecutor的内部实现确实在底层使用了newThreadPerTaskExecutor。这保证了一致性并简化了实现,但这也意味着开发人员可以在需要时直接使用newThreadPerTaskExecutor。 总之,虽然 newThreadPerTaskExecutor 在虚拟线程时代似乎不太相关,但它在某些迁移场景中仍然有用,并且在利基用例中可能很有用。即使生态系统随着新的并发范例而发展,它的包含也确保了开发人员的兼容性和灵活性。