线程池分批执行某个方法(getSkuInfoVos(temList,storeCode1)),所有数据都执行完成后返回数据
List<SkuInfoVo> skuList = Lists.newArrayList();
int totalSize = skuIdList.size();
int pageSize = 5; // 每个线程查询20条商品数据
int totalPage = totalSize / pageSize;
ExecutorService pool = Executors.newFixedThreadPool(totalPage+1);
List<Future<List<SkuInfoVo>>> futureList = Lists.newArrayList();
for (int pageNum = 1; pageNum <= totalPage + 1; pageNum++) {
int starNum = (pageNum - 1) * pageSize;
int endNum = pageNum * pageSize > totalSize ? (totalSize) : pageNum * pageSize;
List<Long> temList = skuIdList.subList(starNum, endNum);
//查询环比数据
String storeCode1 = storeCode;
if (CollectionUtil.isNotEmpty(temList)){
Callable<List<SkuInfoVo>> callable = () -> getSkuInfoVos(temList,storeCode1);
Future<List<SkuInfoVo>> future = pool.submit(callable);
futureList.add(future);
}
}
pool.shutdown(); // 不允许再想线程池中增加线程
try {
//判断是否所有线程已经执行完毕
boolean isFinish = pool.awaitTermination(5, TimeUnit.MINUTES);
//如果没有执行完
if (!isFinish) {
//线程池执行结束 不在等待线程执行完毕,直接执行下面的代码
pool.shutdownNow();
}
for (Future<List<SkuInfoVo>> future : futureList) {
skuList.addAll(future.get());
}
} catch (Exception e) {
e.printStackTrace();
}
return skuList;