import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class ForkJoin {
private static class SumTask extends RecursiveTask<List<Map<String, Object>>> {
private int fromIndex;
private int toIndex;
private Map<String, Object> params;
public SumTask(int fromIndex, int toIndex, Map<String, Object> params) {
super();
this.fromIndex = fromIndex;
this.toIndex = toIndex;
this.params = params;
}
@Override
protected List<Map<String, Object>> compute() {
// 如果任务足够小就触发任务
if (toIndex - fromIndex < 2) {
List<Map<String, Object>> list = new ArrayList<>();
for (int i = fromIndex; i <= toIndex; i++) {
Map<String, Object> req = new HashMap<>();
req.put("pageNum", i);
req.put("pageSize", params.get("pageSize"));
System.out.println("request params:" + req);
// 查询数据库返回值
list.add(new HashMap<>());
}
return list;
} else {
// 如果任务大于阈值,就分裂成两个子任务计算
int mid = (fromIndex + toIndex) / 2;
SumTask left = new SumTask(fromIndex, mid, params);
SumTask right = new SumTask(mid + 1, toIndex, params);
invokeAll(left, right);
List<Map<String, Object>> join = left.join();
join.addAll(right.join());
return join;
}
}
}
public static void main(String[] args) {
ForkJoinPool pool = new ForkJoinPool();
int fromIndex = 1;
int pageSize = 2000;
// 总页数,提前查询出来,数据量不大就不用拆任务
int toIndex = 10;
Map<String, Object> params = new HashMap<>(16);
params.put("pageSize", pageSize);
SumTask innerFind = new SumTask(fromIndex, toIndex, params);
pool.invoke(innerFind);
List<Map<String, Object>> join = innerFind.join();
System.out.println("The count is " + join.size());
pool.shutdown();
}
}