CompletableFuture 是否运行在不同的内核上?

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

当一个人将 CompletableFuture 与 Executor 一起使用时。这些任务是否在不同的内核上运行?或者它可能是相同的核心,但只是来自 Theadpool 的线程?在文档中我无法阅读任何有关它的内容。该任务将在创建 10 个任务的 for 循环中运行。这些会在不同的内核上运行吗?我怎样才能检查这个?谢谢

Executor testExecutor = Executors.newFixedThreadPool(5);
CompletableFuture<String> name = CompletableFuture.supplyAsync(() -> "Baeldung",testExecutor);   
java asynchronous completable-future
2个回答
5
投票

这取决于线程池的大小、您运行的其他线程数量、同一台机器上有多少其他进程竞争资源以及您拥有多少个 CPU 核心(或超线程虚拟核心)。无法保证它们将位于不同的核心上。线程调度由操作系统内核控制,它通常在战略点切换上下文,例如阻塞 I/O 调用,或者当它认为某些 CPU 周期应该专用于等待线程时。

顺便说一句,从 Java 21 开始,现在还拥有虚拟线程,这些线程完全由 JVM 处理,操作系统甚至不会意识到它们。


-4
投票

是的,线程通常在单独的内核上运行。请注意,每个核心仍然只能有一个活动线程(超线程有一些小例外),因此,如果您正在进行繁重的 CPU 处理,则不应创建比核心数量更多的线程。

线程之间的切换也有一些开销,因此请避免创建太多线程,即使它们是 IO 绑定的。您正在使用的线程池是管理该问题的好方法。

您可能找不到很多这方面的资源,因为线程管理是操作系统的责任,而不是语言运行时的责任。

我不知道有什么简单的方法来检查线程正在使用哪个核心,但您始终可以使用任务管理器来检查进程的分布方式。

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