使用FutureTask线程优化并获取执行结果
FutureTask
此线程有三种状态:
- 未启动
- 已启动
- 已完成(正常结束、取消而结束、异常结束)
当主线程调用FutureTask对象的get方法时:
- 未启动 - 主线程阻塞
- 已启动 - 主线程阻塞
- 已完成 - 立即返回结果或抛出异常
原始串行执行
List<Object> list = new ArrayList<>();
for (String entryId : entryIdList) {
Object dataDetails = parserDataService.getDataByEntryId(dataType, entryId);
list.add(dataDetails);
}
需要等方法调用完后执行下一个
并行去执行方法
List<Object> list = new ArrayList<>();
List<FutureTask<Object>> futureTaskList = new ArrayList<>(entryIdList.size());
for (String entryId : entryIdList) {
FutureTask<Object> futureTask =
new FutureTask<>(() -> parserDataService.getDataByEntryId(dataType, entryId));
// 去拿线程池跑线程
poolExecutor.execute(futureTask);
futureTaskList.add(futureTask);
}
// 取结果
futureTaskList.forEach(
objectFutureTask -> {
try {
list.add(objectFutureTask.get());
} catch (InterruptedException e) {
log.error("{}线程中断", Thread.currentThread().getName(), e);
} catch (ExecutionException e) {
log.error("{}线程执行异常", Thread.currentThread().getName(), e);
}
});