1. ForkJoin

2020-05-05  本文已影响0人  格林哈

1. 思路分治

if(任务很小){
    直接计算得到结果
}else{
    分拆成N个子任务
    调用子任务的fork()进行计算
    调用子任务的join()合并计算结果
}

2. API

image.png

3.demo

@Slf4j
public class InsertDataTask extends RecursiveTask<Integer> {
    private GeneralService generalService;
    private List<String> list;
    private static int MAX = 5;
    private int start;
    private int end;

    public InsertDataTask(int start, int end,List<String> list,GeneralService generalService) {
        this.list = list;
        this.start = start;
        this.end = end;
        this.generalService = generalService;
    }

    @Override
    protected Integer compute() {
        int sum = 0;
        if(end - start < MAX ){
            for(int i = start; i <= end; i ++){
                sum ++;
                generalService.excuse(list.get(i));
            }
            return sum;
        } else {
            int middle = (start + end) / 2;
            InsertDataTask left = new InsertDataTask(start,middle,list, generalService);
            InsertDataTask right = new InsertDataTask(middle + 1,end,list, generalService);
            left.fork();
            right.fork();
            return left.join() + right.join();
        }
    }
    
    public static void main(String[] strs){
       List<Map<String, Object>> dataList = dataMap.getValue();
                   // 5000组以上数据分治才有意义
            if(dataList.size() > 5){
                long start = System.currentTimeMillis();
                 ForkJoinPool forkJoinPool = new ForkJoinPool();
                Future<Integer> future =forkJoinPool.submit(new InsertDataTask(0, insertSqlList.size() - 1,insertSqlList,generalService));
                Integer total = future.get();
                long end = System.currentTimeMillis();
                log.debug("子表插入时间:"+(end-start) / 1000 + " s");
            } else {
                // 正常执行
            }    
    }
}

上一篇 下一篇

猜你喜欢

热点阅读