特殊的线程池---Fork/Join框架介绍及实例讲解
来源:互联网 发布:我是歌手网络同步直播 编辑:程序博客网 时间:2024/04/29 23:22
什么是Fork/Join框架
Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。
我们再通过Fork和Join这两个单词来理解下Fork/Join框架,Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算1+2+。。+10000,可以分割成10个子任务,每个子任务分别对1000个数进行求和,最终汇总这10个子任务的结果。Fork/Join的运行流程图如下:
工作窃取算法
工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。工作窃取的运行流程图如下:
ForkJoinPool
Java提供了ForkJoinPool来支持将一个任务拆分成多个“小任务”并行计算,再把多个“小任务”的结果合成总的计算结果。
ForkJoinPool是ExecutorService的实现类,因此是一种特殊的线程池。ForkJoinPool提供了如下两个常用的构造器。
- public ForkJoinPool(int parallelism):创建一个包含parallelism个并行线程的ForkJoinPool
- public ForkJoinPool() :以Runtime.getRuntime().availableProcessors()的返回值作为parallelism来创建ForkJoinPool
创建ForkJoinPool实例后,可以钓鱼ForkJoinPool的submit(ForkJoinTask<T> task)或者invoke(ForkJoinTask<T> task)来执行指定任务。其中ForkJoinTask代表一个可以并行、合并的任务。ForkJoinTask是一个抽象类,它有两个抽象子类:RecursiveAction和RecursiveTask。
- RecursiveTask代表有返回值的任务
- RecursiveAction代表没有返回值的任务。
RecursiveAction
下面以一个没有返回值的大任务为例,介绍一下RecursiveAction的用法。
大任务是:打印0-100的数值。
小任务是:每次只能打印20个数值。
代码执行
运行结果
从上面结果来看,ForkJoinPool启动了四个线程来执行这个打印任务,我的计算机的CPU是四核的。大家还可以看到程序虽然打印了0-999这一千个数字,但是并不是连续打印的,这是因为程序将这个打印任务进行了分解,分解后的任务会并行执行,所以不会按顺序打印。
RecursiveTask
下面以一个有返回值的大任务为例,介绍一下RecursiveTask的用法。
大任务是:计算随机的1000个数字的和。
小任务是:每次只能70个数值的和。
从上面结果来看,ForkJoinPool将任务分解了15次,程序通过SumTask计算出来的结果,和初始化数组时统计出来的总和是相等的,这表明计算结果一切正常。
总结
第一步分割任务
首先我们需要有一个fork类来把大任务分割成子任务,有可能子任务还是很大,所以还需要不停的分割,直到分割出的子任务足够小。
第二步执行任务并合并结果。
分割的子任务分别放在双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都统一放在一个队列里,启动一个线程从队列里拿数据,然后合并这些数据。
能够轻松的利用多个 CPU 提供的计算资源来协作完成一个复杂的计算任务,提高运行效率!
- 特殊的线程池---Fork/Join框架介绍及实例讲解
- 多线程(五) Fork/Join框架介绍及实例讲解
- Fork/Join框架介绍
- Fork/Join框架介绍
- Fork/Join框架介绍
- Fork/Join框架介绍
- Fork/Join框架介绍
- Fork/Join框架介绍
- Fork/Join框架介绍
- Fork/Join框架介绍
- Fork/Join框架介绍
- java Fork/Join框架介绍
- Fork/Join框架介绍 I
- 《Java Fork/Join框架介绍》
- java并发编程的艺术---Fork/Join框架介绍
- Java并发(十)线程池&fork/join框架
- Java线程之fork/join框架
- Java线程之fork/join框架
- poj 1222 poj 1830高斯消元解决开关问题
- Ominiplan 破解码
- 如何快速判定一个或多个素数
- 百度地图绘制矩形区域
- SQL基础学习(一)- SQL 简介
- 特殊的线程池---Fork/Join框架介绍及实例讲解
- 兴趣爱好
- onPreviewFrame报GC问题解决方法
- 有时编译android studio卡在gradle的某个任务
- Linux Nginx 设置开机 自启动 代码 脚本 命令
- Java中容器基础知识小结
- 1、Maven是什么及其优点
- 详解SVN 的使用
- 欢迎使用CSDN-markdown编辑器