gpt4 book ai didi

java - 为什么并行流不使用ForkJoinPool的所有线程?

转载 作者:搜寻专家 更新时间:2023-10-30 19:45:46 24 4
gpt4 key购买 nike

<分区>

所以我知道,如果您在没有自定义 ForkJoinPool 的情况下使用 parallelStream,它将使用默认的 ForkJoinPool,默认情况下,当您拥有处理器时,它会少一个线程。

所以,作为stated here (以及该问题的另一个答案)为了获得更多并行性,您必须:

submit the parallel stream execution to your own ForkJoinPool: yourFJP.submit(() -> stream.parallel().forEach(doSomething));

所以,我这样做了:

import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.stream.IntStream;
import com.google.common.collect.Sets;

public class Main {

public static void main(String[] args) throws InterruptedException, ExecutionException {

ForkJoinPool forkJoinPool = new ForkJoinPool(1000);

IntStream stream = IntStream.range(0, 999999);

final Set<String> thNames = Collections.synchronizedSet(new HashSet<String>());

forkJoinPool.submit(() -> {
stream.parallel().forEach(n -> {

System.out.println("Processing n: " + n);
try {
Thread.sleep(500);
thNames.add(Thread.currentThread().getName());
System.out.println("Size: " + thNames.size() + " activeCount: " + forkJoinPool.getActiveThreadCount());
} catch (Exception e) {
throw new RuntimeException(e);
}
});
}).get();
}
}

我制作了一组线程名称以查看正在创建的线程数,并且还记录了池中 Activity 线程的数量,这两个数字都不会超过 16,所以这意味着这里的并行度不超过 16(为什么还要 16?)。如果我不使用 forkJoinPool,我会得到 4 作为并行度,这取决于我拥有的处理器数量。

为什么它给我 16 而不是 1000?

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