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())用作辅助线程。当工作线程阻塞时,它还可能创建其他线程。