多线程处理业务接口查询费时问题

用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;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值