线程池ForkJoinPool

ForkJoinPool线程池最大的特点就是分叉(fork)合并(join),将一个大任务拆分成多个小任务,并行执行,再结合工作窃取模式(worksteal)提高整体的执行效率,充分利用CPU资源。
线程池ForkJoinPool_第1张图片
从图中可以看出ForkJoinPool要先执行完子任务才能执行上一层任务,所以ForkJoinPool适合在有限的线程数下完成有父子关系的任务场景,比如:快速排序,二分查找,矩阵乘法,线性时间选择等场景,以及数组和集合的运算。

ThreadPoolExecutor

线程池ForkJoinPool_第2张图片

ForkJoinPool

线程池ForkJoinPool_第3张图片
ForkJoinPool每个线程都有自己的队列
ThreadPoolExecutor共用一个队列

ForkJoinPool是ThreadPoolExecutor线程池的一种补充,是对计算密集型场景的加强。

工作窃取模式主要分以下几个步骤:

1.每个线程都有自己的双端队列
2.当调用fork方法时,将任务放进队列头部,线程以LIFO顺序,使用push/pop方式处理队列中的任务
3.如果自己队列里的任务处理完后,会从其他线程维护的队列尾部使用poll的方式窃取任务,以达到充分利用CPU资源的目的
4.从尾部窃取可以减少同原线程的竞争
5.当队列中剩最后一个任务时,通过cas解决原线程和窃取线程的竞争.
线程池ForkJoinPool_第4张图片
JDK8中的并行流(parallelStream)功能是基于ForkJoinPool实现的.
原文链接

你可能感兴趣的:(redis,数据库,缓存)