3

如果我运行以下代码:

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。

4

0 回答 0