```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);
}