Executors#newThreadPerTaskExecutor 的需求/使用是什么?

问题描述 投票:0回答:1

我正在浏览一些最近引入的公共 API,并偶然发现了 JDK 21+ 中的

Executors.newThreadPerTaskExecutor

创建一个执行器,为每个任务启动一个新线程。号码 Executor 创建的线程数量是无限的。

但是从某些参考文献中,我了解到,在虚拟线程之前,开发人员将被限制创建“有限数量的线程”。当然,对于虚拟线程,我们希望开发人员不必担心此类限制,但通过 newVirtualThreadPerTaskExecutor

 进行创建无论如何都会提供可能需要的无限制执行器。
我进一步引用

JEP-444

(强调我的):

此外,
Executors.newThreadPerTaskExecutor(ThreadFactory)

Executors.newVirtualThreadPerTaskExecutor()
创建一个ExecutorService 为每个任务创建一个新线程。这些方法
启用
迁移以及与使用线程的现有代码的互操作性 池和 ExecutorService。

我想不出迁移会寻求使用
newThreadPerTaskExecutor
API 的用例。我考虑迁移现有代码的想法是,如果向实例提供了现有的

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+ 中虚拟线程的引入。让我们分解您的观点并解决您的问题:
java executorservice java-21 virtual-threads
1个回答
0
投票

Executors.newThreadPerTaskExecutor 与 newVirtualThreadPerTaskExecutor:

Executors.newThreadPerTaskExecutor

创建一个执行器,为每个任务启动一个新线程。这可能会导致创建无限数量的线程。

JEP-443 中引入了 newVirtualThreadPerTaskExecutor

以支持虚拟线程。它创建一个行为类似于 newThreadPerTaskExecutor 的执行器,但它使用虚拟线程而不是本机线程。

迁移和互操作性

:

包含 newThreadPerTaskExecutor

背后的动机是为了促进依赖于线程池和 ExecutorService 的现有代码的迁移和互操作性。 通过提供此方法,开发人员可以轻松替换现有的实例 ExecutorService 由线程池支持,具有类似的执行器,为每个任务创建一个新线程。这在现有代码库严重依赖此类行为的某些迁移场景中可能很有用。

用例和潜在的误用:

您正确地指出,随着虚拟线程的出现,开发人员不太可能需要无限数量的线程。虚拟线程是轻量级的,可以大量创建,而不会有资源耗尽的风险。 newThreadPerTaskExecutor 在实践中可能会减少使用频率,特别是当开发人员接受虚拟线程及其优势时。 但是,可能仍然存在需要或需要 newThreadPerTaskExecutor 行为的利基用例或特定场景。

内部实施

newVirtualThreadPerTaskExecutor的内部实现确实在底层使用了newThreadPerTaskExecutor。这保证了一致性并简化了实现,但这也意味着开发人员可以在需要时直接使用newThreadPerTaskExecutor。 总之,虽然 newThreadPerTaskExecutor 在虚拟线程时代似乎不太相关,但它在某些迁移场景中仍然有用,并且在利基用例中可能很有用。即使生态系统随着新的并发范例而发展,它的包含也确保了开发人员的兼容性和灵活性。

© www.soinside.com 2019 - 2024. All rights reserved.