做需求时,需要查询出部门一些数据,对这些数据进行业务校验(是否满足订单创建条件),这个业务校验分为三大块,需要走多个查询,如果数据量比较大的时候,这个校验过程会变慢,于是想到使用多线程来校验,下面是代码实践:
taskDetailList= xxxService.getXxxx();
if (taskDetailList==null || taskDetailList.size()==0){
return null;
}
final int nThreads = 10;
final int size = taskDetailList.size();
ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
List< Future<DispatchCheckDto>> futures =
new ArrayList<Future<DispatchCheckDto>>(nThreads);
try {
for ( int i = 0; i < size; i++) {
final xxxxEntity subEntity = taskDetailList.get(i);
Callable<xxxDto> task = new Callable<xxxDto>() {
@Override
public DispatchCheckDto call() throws Exception {
return checkForThread(subEntity);
}
};
futures.add(executorService.submit(task));
}
for ( Future<xxxDto> future : futures) {
xxxDto fuDto = null;
try {
fuDto = future.get();
if(fuDto!= null&&StringUtils.isEmpty(fuDto.getFailReason())){
result.add(fuDto);
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
} finally {
executorService.shutdown();
}
long endTimde = System. currentTimeMillis();
LOGGER.info( "使用多线程校验信息耗时:" +(endTimde-startTime)+" ms,校验条数:" +size);
看上面的代码,跟之前的多线程实现不同(之前要实现一个多线程,一般是写一个线程类或者实现runnable接口),executorService是jdk7的新出的封装方法,主要在于Callable里实现具体逻辑,使用executorService.submit(task) 进行线程调度,另外需要注意的是在finally块中要对executorService创造出来的线程shutdown掉。