Java常见的ForkJoinPool并行性

时间:2017-05-21 11:52:36

标签: 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 -> {
        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。

0 个答案:

没有答案