簡介
ForkJoin 通俗來講就是把一件事情拆分成若干個遞歸的小事情,並且框架提供多線程形式併發完成多個小事情後合併結果,完成大事情
小代碼實例
/**
* 測試客戶端
*
* @author ljs.song
* @date 2017-11-07 17:50
*/
public class Test {
public static void main(String[] args) throws Exception {
ForkJoinPool forkJoinPool = new ForkJoinPool();
LongAdder sum = new LongAdder();
List<Integer> nums = Arrays.asList(1,2,3,4,5,6,7,8,9);
forkJoinPool.invoke(new AddTask(nums,sum));
forkJoinPool.shutdown();
System.out.println(sum);
}
private static class AddTask extends RecursiveAction{
private List<Integer> nums;
private LongAdder sum;
public AddTask(final List<Integer> nums, LongAdder sum) {
this.nums = nums;
this.sum = sum;
}
/**
* 拆分任務,二分法拆分數組,拆到只有一個元素後再分別累加
*/
@Override
protected void compute() {
System.out.println(Thread.currentThread().getName());
int size = nums.size();
if(size > 1){
int parts = size /2;
List<Integer> left = nums.subList(0, parts);
AddTask leftTask = new AddTask(left, sum);
List<Integer> right = nums.subList(parts,size);
AddTask rightTask = new AddTask(right, sum);
invokeAll(leftTask, rightTask);
}else{
if(size == 0){
return ;
}
sum.add(nums.get(0));
}
}
}
}