0
点赞
收藏
分享

微信扫一扫

多线程实现归并

zhongjh 2022-05-03 阅读 71

```java`在这里插入代码片
突然想到水平分库最后查询是要归并的,当然貌似sharding执行了这个逻辑,不过多线程好像也能实现归并,就照着模子写了一个,这个线程池还是感觉很难掌握
在这里插入代码片

    static {
        lists.add(new ArrayList<Integer>(){{
            add(1);
            add(2);
            add(5);
            add(7);
        }});
        lists.add(new ArrayList<Integer>(){{
            add(2);
            add(3);
            add(5);
            add(7);
            add(9);
        }});
        lists.add(new ArrayList<Integer>(){{
            add(1);
            add(2);
            add(5);
            add(7);
        }});
//        lists.add(new ArrayList<Integer>(){{
//            add(2);
//            add(3);
//            add(5);
//            add(7);
//            add(9);
//        }});

    }

  static class AddTask extends RecursiveTask<List<Integer>> {
    Integer left, right;

    AddTask(Integer l, Integer r) {
        left = l;
        right = r;
    }

    @Override
    protected List<Integer> compute() {
        //如果有序数组有两个则进行归并
        if (right - left == 1) {
            List<Integer> lleft = lists.get(left);
            List<Integer> lright = lists.get(right);
            return www(lleft,lright);
        }
        //一个有序数组直接返回
        if (right - left == 0) {
            List<Integer> lright = lists.get(right);
            return lright;
        }
        //超过两个则fork子线程进行归并
        int middle = left + (right - left) / 2;
        AddTask subTask1 = new AddTask(left, middle);
        AddTask subTask2 = new AddTask(middle + 1, right);
        subTask1.fork();
        subTask2.fork();
        return merge(subTask1.join(),subTask2.join());
    }
    //归并逻辑
    private static List<Integer> merge( List<Integer> lleft,List<Integer> lright){
        List<Integer> res = new ArrayList<>();
        int i = 0;
        int j = 0;
        while (i < lleft.size()  && j < lright.size()){
            if (lleft.get(i) <= lright.get(j)){
                res.add(lleft.get(i));
                i ++;
                continue;
            }else {
                res.add(lright.get(j));
                j++;
                continue;
            }
        }
        while (i < lleft.size() ){
            res.add(lleft.get(i));
            i ++;
            continue;
        }
        while (j < lright.size() ){
            res.add(lright.get(j));
            j++;
            continue;
        }
        return res;
    }
}
    public static void main(String[] args) throws IOException {
        ForkJoinPool f = new ForkJoinPool();
        AddTask task = new AddTask(0,lists.size() - 1);
        f.execute(task);
        List<Integer> result = task.join();
        System.out.println(result);
    }

举报

相关推荐

0 条评论