为什么并行流不使用 ForkJoinPool 的所有线程?
所以我知道,如果你使用没有自定义ForkJoinPool的,它将使用默认的ForkJoinPool,默认情况下,它比你有处理器少一个线程。parallelStream
因此,正如这里所述(以及该问题的其他答案),为了获得更多的并行性,您必须:
将并行流执行提交到您自己的 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();
}
}
我制作了一组线程名称,以查看正在创建的线程数,并且还记录了池具有的活动线程数,并且两个数字都不会增长到16,因此这意味着这里的并行度不超过16(为什么甚至16?)。如果我不使用forkJoinPool,我会得到4作为并行度,这是根据我拥有的处理器数量。
为什么它给我16而不是1000?