用ExecutorService+CountDownLatch结合的方式处理接口加载慢的问题。
工具类:
public class TaskExecutor {
// 线程池
private final ExecutorService executorService;
// 同步器
private final CountDownLatch countDownLatch;
// 超时时间
private final long keepAliveTime;
// 超时单位
private final TimeUnit timeUnit;
// taskCount指的任务数
public TaskExecutor(int taskCount) {
this.keepAliveTime = 3;
this.timeUnit = TimeUnit.SECONDS;
this。executorService = new ThreadPoolExecutor(taskCount, taskCount, keepAliveTime, timeUnit, new LinkedBlockingQueue<>());
this.countDownLatch = new CountDownLatch(taskCount);
}
public void executorTask(EmptyConsumer emptyConsumer) {
executorService.execute(() -> {
emptyConsumer.accept();
countDownLatch.countDown();
});
}
public void await() {
try {
countDownLatch.await(keepAliveTime, timeUnit);
} catch (InterruptedException e) {
throw new LocalException("业务数据加载失败");
}
}
}
// 无参函数
@FunctionalInterface
public interface EmptyConsumer {
public void accept();
}
// 实际用例:
/**
* 获取XXX详情
*/
@Override
public SuperviseTransactionDetailVo getSuperviseTransactionDetail(String projectId) {
SuperviseProject project= superviseProjectMapper.selectById(projectId);
if (null == superviseProject) {
throw new LocalException("项目不存在");
}
//设置结果集
SuperviseTransactionDetailVo detail = new SuperviseTransactionDetailVo(project);
//使用多线程填充各项数据
TaskExecutor taskExecutor = new TaskExecutor(4);
// 项目相关材料
taskExecutor.executorTask(() -> detail.putDocuments(findProjectDocuments(projectId)));
// 查询项目相关报道
taskExecutor.executorTask(() -> detail.putReports(findProjectReports(projectId)));
// 相关进展
taskExecutor.executorTask(() -> detail.putActivities(findProjectActivitys(projectId)));
// 小组
taskExecutor.executorTask(() -> {
// 小组
List<SupervisePepoleGroup> projectGroups = findProjectGroups(projectId);
// 小组成员
Map<String, List<ChooseUserVo>> groupUsers = findGroupUsers(projectGroups);
detail.putGroups(projectGroups, groupUsers);
});
taskExecutor.await();
return detail;
}