JUC(5) : ForkJoinPool | 线程的极致管理

一、前言

前文介绍了线程的异步编排工具类 CompletableFuture 的使用,使用它能够很好的完成线程任务的编排工作,但同时,我们也注意到,其使用的默认线程池是 ForkJoinPool.commonPool() 的方法。则这个线程池是共用的,而为了业务之间互不影响,比如 A 业务秒杀并发量大,占用了大多数的线程,那 B 业务再使用这个线程池的话,就无法很好的推进下去。

观其源码也知在并行流时用到了 ForkJoinPool 的公共线程池。ForkJoinPool 是专门设计用于 Fork/Join 的线程池,什么是 Fork/Join 呢?这个 ForkJoinPool 这个线程池和我们学的 ThreadPoolExcutor 有啥区别呢?下图为ForkJoinPool 与我们熟知的线程池间的继承关系。下文,我们将解答这些疑惑,并学习相关概念并上手使用。

二、ForkJoinPool

2.1 概述

首先,查看该类介绍,该类是 Doug Lea 在JDK1.7版本中添加的新的线程池。Fork为分叉,Join 为连接,而其设计的思想也确实是先分开处理后合并处理的工作原理。核心思想就是把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务的结果。

Fork:把一个复杂任务进行分拆,大事化小
Join:把分拆任务的结果进行合并
复制代码

这个思想就很像 Hadoop 中 MapReduce 的工作原理,都是先组装成各个 Map ,然后在 Reduce 中完成合并。 ForkJoinPool 也是使用了分而治之的算法,用相对较少的线程处理大量的任务,将大任务一拆为二,以此类推,每个子任务再分成两半,知道达到阈值(自己设定)然后组成 N 个具有父子层级关系的任务。这时候 ForkJoinPool 就会安排合理的工作线程,例如 8个线程,让它们不断得去干活,先把它们的最下层的小任务干完,接着再去干小任务的父任务,一层层直到任务结束。

由此,可知既然它擅长干一些能拆分成父子任务的工作。所以例如快速排序、二叉查找等任务。最适合的是计算密集型的任务,比如是数据量很大的一个统计,如果是存在 IO交互,线程间同步,那就不太适合了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值