并发编程发展
Java 1 支持thread,synchronized。
Java 5 引入了 thread pools, blocking queues, concurrent collections,locks, condition queues。
Java 7 加入了fork-join库。
Java 8 加入了 parallel streams。 并行流:
基本设计思想:
Fork/JOin 是java7提供的并行执行任务的框架,是一个把大任务分割成若干小任务,最终汇总小任务的结果得到大任务结果的框架
小任务可以继续不断拆分n多个小任务:
image.png
基本伪代码:
if(任务很小)
{
直接计算得到结果
}else{
分拆出N个子任务
调用子任务的fork()进行计算
调用子任务的join()合并计算结果
}
工作窃取机制:
将一个大的任务,拆分成n多个不同的子任务,一直到不可以拆分为止。
例如: 将一个大的任务,差分成n多个子任务,每个任务中对应一个独立的队列。
由于每个线程处理的速度不一样,如果先执行完成任务的队列的线程,窃取其他没有执行完任务的度列。
相关APi 内容
1,RecursiveAction:用于没有返回结果的任务
2,RecursiveTask用于有返回结果的任务:
Compute()方法计算:
Fork()方法 Fork()方法类似于Threadstart(),但是他并不立即执行任务,而是将任务放入工作队列里,拆分子任务。
join()合并子任务支持join 即任务结果的合并。
通过invoke()方法提交任务,调用线程直到任务执行完毕才会返回,也就是说这是一个同步的方法,且有返回结果。
同过execute方法提交的任务,调用线程会立即返回,也就是说这是一个异步方法,且没有返回结果。
通过subbmit方法提交的任务,调用线程会立即返回,也就是说这是一个异步的方法,且有返回结果(返回Future实现类,可以通过get获取结果)
ForkJOIN用法
使用ForkJoin计算总和:
网友评论