gpt4 book ai didi

java - 为什么 fork join 任务在公共(public) fork join 池线程之外执行?

转载 作者:行者123 更新时间:2023-12-02 04:29:59 27 4
gpt4 key购买 nike

我的问题最好通过给出代码片段来解释:

public static void main(final String[] a) {
Stream.of(1, 2, 3, 4).map(i -> ForkJoinPool.commonPool().submit(new RecursiveAction() {
@Override
protected void compute() {
System.out.println(Thread.currentThread());
}
})).forEach(ForkJoinTask::join);
}

在我的 4 核笔记本电脑上运行此命令时,会打印:

Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]
Thread[main,5,main]
Thread[ForkJoinPool.commonPool-worker-1,5,main]

为什么某些任务在主线程中运行,而主线程是公共(public) fork join 线程池之外的线程?

创建自定义 fork join 线程池时,不会发生这种情况:

public static void main(final String[] a) {
final ForkJoinPool p = new ForkJoinPool(4);

Stream.of(1, 2, 3, 4).map(index -> p.submit(new RecursiveAction() {
@Override
protected void compute() {
System.out.println(Thread.currentThread());
}
})).forEach(ForkJoinTask::join);
}

Thread[ForkJoinPool-1-worker-1,5,main]
Thread[ForkJoinPool-1-worker-1,5,main]
Thread[ForkJoinPool-1-worker-1,5,main]
Thread[ForkJoinPool-1-worker-1,5,main]

那么,换句话说,公共(public)池有什么特别之处呢?有了这些知识,在公共(public)池中执行长时间运行的任务是明智还是不明智的想法?

最佳答案

一些相当聪明的事情发生了。

当您从不在该线程中的线程调用 ForkJoinTask::join 时,看起来(来自 ForkJoinPool.awaitJoin 上的注释)当前线程可以“帮助”任务执行。

这就是主线程在 fork-join 池中执行任务的原因。

但是为什么在您创建自定义池的情况下会有所不同?好吧,我的猜测是您的自定义池有足够的线程,不需要主线程。因为另一件事是,默认情况下,“公共(public)池”是用比可用处理器数量少的一个线程创建的。

<小时/>

更多细节请查看源代码。请注意,javadoc 中未指定此行为,因此在未来的实现中可能会发生变化。

关于java - 为什么 fork join 任务在公共(public) fork join 池线程之外执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45892702/

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