//进行任务分解
long begin = System.currentTimeMillis();
List<Future<String>> futureList = this.getSmoothDataFuture(fundIdList, 30);
// 阻塞等待所有线程全部执行完毕
for (Future<String> future : futureList) {
log.info("处理数据,线程执行返回结果:" + future.get().toString());
}log.info("数据处理耗时:" + (System.currentTimeMillis() - begin) / 1000 + "秒");
/**
* 通过多线程处理,并返回Future
*
* @param fundIdList
* @return List<Future<String>>
*/
private List<Future<String>> getSmoothDataFuture(List<String> fundIdList, int threadSize) {
int length = fundIdList.size();
int pageSize = length / threadSize;
// 创建指定大小的线程池
ExecutorService executorService = Executors.newFixedThreadPool(threadSize);
// 创建多个有返回值的任务
List<Future<String>> futureList = new ArrayList<Future<String>>();
for (int i = 1; i <= threadSize; i++) {
int start = (i - 1) * pageSize;
int end = i * pageSize;
if (i == threadSize) { // 最后一个线程处理剩余所有的数据
end = length;
}
List<String> subFundIdList = fundIdList.subList(start, end); // 包括start,不包括end
// 初始化多线程辅助类
FundSmoothCallable callable = new FundSmoothCallable(subFundIdList, "线程" + i);
// 传递数据库引用
callable.setFundSmoothService(fundSmoothService);
// 执行任务并获取Future对象
Future<String> future = executorService.submit(callable);
futureList.add(future);
}
// 关闭线程池
if (!executorService.isShutdown()) {
executorService.shutdown();
}
return futureList;
}