线程池-执行机制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
JAVA 递归线程池 ExecutorService / ForkJoinPool