线程池-执行机制ForkJoinPool的commonPool详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池-执行机制ForkJoinPool的commonPool详解相关的知识,希望对你有一定的参考价值。

参考技术A 为了避免任何并行操作都引入一个线程池,最坏情况会导致在单个JVM上创建了太多的池线程,降低效率。

ForkJoinTask一定会运行在一个ForkJoinPool中,如果没有显式地交它提交到ForkJoinPool,会使用一个common池(全进程共享)来执行任务。

以parallelStream为例,其ReduceTask会调用invoke:

调用的是ForkJoinTask的invoke:

调用CountedCompleter的exec():

调用stream包下面的AbstractTask.compute:

调用ForkJoinTask的fork:

使用common pool的优点就是我们可以通过指定系统参数的方式定义“并行度、线程工厂和异常处理类”。

JAVA 递归线程池 ExecutorService / ForkJoinPool

测试工具启动会递归的方式进行子进程的消息获取,目前有2种常用的ExecutorService / ForkJoinPool

为了测试哪种效果较好,我们来写个测试Demo,循环5555555次+1(加锁),统计每种执行完后耗时和GC数据

 

结果很明显,递归线程池使用ForkJoinPool更佳

 

int nCpu = Runtime.getRuntime().availableProcessors();

ExecutorService executorPool  = Executors.newFixedThreadPool(nCpu);
ForkJoinPool forkJoinPool = new ForkJoinPool(nCpu);

 

TestData:5555555 , RunTime:1543 ms :ExecutorService executorPool

TestData:5555555 , RunTime:746 ms :ForkJoinPool forkJoinPool

以上是关于线程池-执行机制ForkJoinPool的commonPool详解的主要内容,如果未能解决你的问题,请参考以下文章

juc线程高级特性——线程池 / 线程调度 / ForkJoinPool

ForkJoinPool线程池工作原理

JAVA 递归线程池 ExecutorService / ForkJoinPool

ForkJoinPool 源码

为啥parallelStream 使用ForkJoinPool,而不是普通的线程池?

java多线程 -- ForkJoinPool 分支/ 合并框架 工作窃取