用 executorservice callable future 方式实现的并发接口 对数据进行分组处理
然而此并发接口的效率太差,甚至比我之前写的单线程方法还慢很多,而且CPU的占用率太高。
以下是我的方法代码,请各位大哥大姐,小弟小妹多多指教
,以下是方法代码:
public ListNewInsuranceCostDetailResp queryCostDetailInfo(ListNewInsuranceCostDetailReq req) {
ListNewInsuranceCostDetailResp resp = new ListNewInsuranceCostDetailResp();
// 创建线程池
ExecutorService executor = Executors.newCachedThreadPool();
// 创建Callable对象任务
long allRows = newInsuranceCostRepository.count(req);
long remainderRow = allRows % THREAD_LIMIT;
long size = (allRows - remainderRow) / THREAD_LIMIT;
List<NewInsuranceCallable> tasks = new ArrayList<NewInsuranceCallable>();
for (int i = 0; i < THREAD_LIMIT; i++) {
// 创建任务
NewInsuranceCallable task = new NewInsuranceCallable();
req.getPubData().getPages().setStartRowno(size * i);
req.getPubData().getPages().setLastRowno(size * (i + 1));
if (i != 0 && i == THREAD_LIMIT - 1) {
req.getPubData().getPages().setLastRowno(size * (i + 1) + remainderRow);
}
task.setReq(req);
task.setNewInsuranceCostRepository(newInsuranceCostRepository);
tasks.add(task);
}
List<NewInsuranceCostDetailDisplayVo> result = new ArrayList<NewInsuranceCostDetailDisplayVo>();
CompletionService<List<NewInsuranceCostDetailDisplayVo>> ecs = new ExecutorCompletionService<List<NewInsuranceCostDetailDisplayVo>>(executor);
for (NewInsuranceRepositoryImpl t : tasks) {
ecs.submit(t);
}
executor.shutdown();
int n = tasks.size();
for (int i = 0; i < n; ++i) {
try {
List<NewInsuranceCostDetailDisplayVo> r = ecs.take().get();
if (r != null) {
result.addAll(r);
}
} catch (InterruptedException e) {
logger.error("查询中断");
} catch (ExecutionException e) {
logger.error("查询出错");
}
}
req.getPubData().getPages().setCountrows(result.size());
Pages pages = req.getPubData().getPages();
resp.setPages(pages);
resp.setData(result);
return resp;
}