如果我运行以下代码:
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。