如果我运行以下代码:
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个,所以我希望在~82ms而不是4个时打印三个作业。
是我的代码还是理解是不对的?
ETA:在forEach中打印掉Thread.currentThread()。getId()也会显示4个不同的线程ID。