1、使用Fork/Join并行查询业务,如例子中根据多个id查询XX业务,可以分割成多个子任务并行查询
public class ForkJoinDemoService extends RecursiveTask<List<MSGroupVO>> { /** * 序列 */ private static final long serialVersionUID = -8887828259415562910L; /** * 子任务查询参数阈值 */ private static final int LIST_SIZE_THRESHOLD = 5; // 参数,id列表 private List<String> idList; /** * 构造函数 */ public ForkJoinDemoService(List<String> idList) { this.idList = idList; } /** * 并行执行 * @return */ @Override protected List<MSGroupVO> compute() { // 获得业务Service实例 IGroupRoleService groupRoleService = new GroupRoleService(); // 查询结果 List<MSGroupVO> list = new ArrayList<MSGroupVO>(); // id个数少于阈值时,可以直接执行任务 boolean canCompute = idList.size() <= LIST_SIZE_THRESHOLD; if(canCompute) { String ids = StringUtils.join(idList, ","); list = groupRoleService.findGroups(ids); } else { // 参数id个数超过设置的阈值,则分割成两个子任务 int mid = idList.size() / 2; List<String> leftList = idList.subList(0, mid); List<String> rightList = idList.subList(mid, idList.size()); ForkJoinDemoService leftTask = new ForkJoinDemoService(leftList); ForkJoinDemoService rightTask = new ForkJoinDemoService(rightList); //执行子任务 leftTask.fork(); rightTask.fork(); //等待子任务执行完,并得到结果 List<MSGroupVO> leftResult = leftTask.join(); List<MSGroupVO> rightResult = rightTask.join(); // 汇总结果并返回 list.addAll(leftResult); list.addAll(rightResult); } return list; } /*public static void main(String[] args) { ForkJoinPool forkJoinPool = new ForkJoinPool(); List<String> ids = new ArrayList<String>(); ids.add("1800"); ids.add("1803"); ids.add("1804"); ids.add("2200"); ids.add("2201"); ids.add("2202"); ids.add("2203"); ids.add("2204"); ids.add("2205"); ids.add("2206"); ids.add("2207"); ForkJoinDemoService task = new ForkJoinDemoService(ids); Future<List<MSGroupVO>> result = forkJoinPool.submit(task); try { List<MSGroupVO> list = result.get(); System.out.println(list); } catch (Exception e) { } }*/ }