Java公共池并行性
如果我运行以下代码:Java公共池并行性,java,multithreading,fork-join,forkjoinpool,Java,Multithreading,Fork Join,Forkjoinpool,如果我运行以下代码: System.out.println("Common Pool Parallelism: " +ForkJoinPool.getCommonPoolParallelism()); long start = System.currentTimeMillis(); IntStream.range(0, ForkJoinPool.getCommonPoolParallelism() * 2) .parallel() .forEach(i -&g
System.out.println("Common Pool Parallelism: "
+ForkJoinPool.getCommonPoolParallelism());
long start = System.currentTimeMillis();
IntStream.range(0, ForkJoinPool.getCommonPoolParallelism() * 2)
.parallel()
.forEach(i -> {
System.out.println(i +" " +(System.currentTimeMillis() - start) +"ms");
LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(1));
});
我得到(例如)以下输出:
Common Pool Parallelism: 3
5 82ms
3 82ms
1 82ms
0 82ms
4 1087ms
2 1087ms
在我看来,似乎公共ForkJoinPool使用了4个线程,然后它们被阻塞了一秒钟,最后两个作业被运行
但据我所知,公共ForkJoinPool默认使用Runtime.getRuntime().availableProcessors()-1线程,在我的例子中是3个线程,因此我希望以大约82毫秒而不是4毫秒的速度打印三个作业
是我的代码或理解有问题吗
ETA:在forEach中打印出Thread.currentThread().getId()还显示了4个不同的线程ID。FJ框架将提交线程(您的main())用作辅助线程。当工作线程阻塞时,它还可能创建其他线程。