Fork-join
fork-join是一个多线程并发工具,但是它屏蔽了多线程相关知识,只要遵循其开发模式即可.
其核心思想为–分而治之.在十大经典算法中,快速排序、归并排序、二分查找,还有大数据中的R/M都是使用该思想.
- 分治法设计思想:将一个难以解决的大问题,分割成n个小问题,而且n个小问题之间没有关联关系,独立且与原问题形式相同(子问题之间如果有关系,则变为动态规划算法),每个小问题的结果合并得到原大问题的解.
- Fork-Join原理
- 工作密取
即当前线程task做完了,则自动获取其他线程的task来执行,这样能加快任务的处理速度,减少线程的阻塞和闲置时间,提高CPU利用率.
Fork-Join实战
- Fork-Join使用标准范式
我们使用Fork-Join框架时,必须要创建一个ForkJoin任务,它提供在任务中执行的fork和join机制,通常情况下我们不直接继承ForkjoinTask类,只需要继承其子类即可.
①RecursiveAction,用于没有返回值的任务
②RecursiveTask,用于有返回值的任务
task是要通过ForkjoinPool来执行的,用submit和invoke来提交。两者区别是:
①invoke是同步提交,需要等待结果完成才返回
②submit是异步提交
join()和get()方法当任务完成时候返回计算结果.
工作范式示意图:
我们会在compute方法内判断每个子任务是否已经够小,如果足够小,则直接执行任务,如果不够小,那就必须要分隔成两个小任务,每个子任务调用invokeAll方法时,会再次进入compute重新判断.使用join方法即等待子任务执行完并得到结果
代码示例:
public class SumArray {
private static clas