一、概念
Fork/Join框架是Java7提供的一个用于并行执行任务的框架,思想是把一个大任务分解成多个小任务,并行执行小任务,最后合并每个小任务的执行结果获得大任务结果。
work-stealing算法:工作窃取算法,一个线程从其他线程的任务队列中窃取任务来执行,使用双端队列实现。优点:利用多线程进行并行计算;缺点:创建队列增加系统开销。
二、原理
1.分割任务
需要一个task类,继承
RecursiveTask类
,能够递归将任务分割为小任务,直到任务足够小为止。
2.执行任务、合并结果
将分割成的子任务分别放入双端队列,启用多个线程分别执行多个任务队列中的任务,任务返回结果后进行合并。
三、基本使用
1.使用流程
继承RecursiveTask类,实现compute()方法,创建ForkJoinPool对象,调用pool的invoke(task)/submit(task)方法来执行任务。
compute()方法中需要定义在任务不满足条件时,继续分割任务,子任务递归调用compute()方法,直到满足足够小的条件再对子任务进行计算并返回结果。
2.ForkJoinPool构造
参数有:
parallelism:可并行级别,决定框架内并行执行的线程数量。
asyncMode:异步模式,指定任务队列是先进先出模式或后进先出模式。
通常推荐使用该类的静态方法commonPool()来快速获取ForkJoinPool对象。
3.核心方法
fork方法:将子任务放入当前线程的workQueue的双端队列中,框架根据当前正在并发执行ForkJoinTask任务的ForkJoinWorkerThread线程状态,决定让这个任务在队列中等待,或者创建一个新workerThread线程运行它,或者唤醒其他等待任务的
workerThread执行它。
join方法:让当前线程阻塞,直到调用join的子任务执行完并返回结果。如果该子任务在当前线程的任务等待队列workQueue中,则取出该子任务然后递归执行完毕。