gpt4 book ai didi

java - 为什么 ForkJoinPool 使用 ThreadPerTaskExecutor?

转载 作者:行者123 更新时间:2023-11-30 12:06:18 32 4
gpt4 key购买 nike

我们在两个 CPU 环境中用 Java 运行一个 Akka 应用程序,我们观察到每次 tell 都会启动一个新线程,而不是从池中取出它们。 Akka 默认调度器使用 ForkJoinPool 作为默认执行器。在 CompletableFuture 代码中有以下逻辑:

private static final boolean useCommonPool =
(ForkJoinPool.getCommonPoolParallelism() > 1);


private static final Executor asyncPool = useCommonPool ?
ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();

static final class ThreadPerTaskExecutor implements Executor {
public void execute(Runnable r) { new Thread(r).start(); }
}

commonPoolParallelism 的值来自 Runtime.getRuntime().availableProcessors() - 1(如果未指定 JVM 属性) - ForkJoinPool.makeCommonPool( )

因此,在我们的例子中 - 我们只有两个 CPU - ForkJoinPool 根本没有被使用。它默认使用 ThreadPerTaskExecutor。我知道我们可以覆盖它(我们这样做并且会导致性能显着提高)。但这让我想知道为什么会这样?为什么即使对于一个 CPU(更不用说两个)每次都启动新线程也比从池中重用一个更好?为什么这是 ForkJoinPool 的默认行为?

最佳答案

如果调度程序只有一个线程并且该线程被阻塞、死锁等,那么整个 actor 系统就会戛然而止。对于每个任务的线程,这不会发生。

关于java - 为什么 ForkJoinPool 使用 ThreadPerTaskExecutor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55649442/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com