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)
{
}
}*/
}