实现多线程返回值收集
最近有一个需求,需要查询大量数据并进行分析,最后对结果进行处理。由于数据量比较大,故采用多线程来进行数据的查询和处理,但是在最后对结果进行收集时出现了问题。开始采用Runnable接口来实现多线程,但是此方法不支持返回值无法获取到结果,后来通过参数传递进集合来进行收集,此时会发现子程序还未完成主程序已经执行完,集合此时为空,收集结果失败。
经过查询资料,发现java多线程有一个Callable接口,此接口支持返回值,解决了不能收集多线程执行结果的问题。具体操作如下(并非完整代码)。
1.实现Callable接口
public class ExportAccForecast implements Callable<List<Map>>{
}
Callable<List
2. ExecutorService调用开启线程
public static ExecutorService executorService;
executorService = new ThreadPoolExecutor(CPUNum * threadNumPerCPU*2, CPUNum * threadNumPerCPU*2, 0L,
TimeUnit.MILLISECONDS, workQueue,
new CBSSOrderThreadFactory());
for (TRegion region : provinceRegionList) {
Future<List<Map>> future = CBSSOrderProcessor.executorService.submit(new ExportAccForecast(region));
List<Map> maps = future.get();
dataList.addAll(maps);
}
future.get()会获取到线程返回的结果,如果线程未结束,主线程会在此处等待子线程完成,返回结果。