线程池分类:
FixThreadPool
CachedThreadPool
ScheduledThreadPool
SingleThreadPool

详细了解点击

几种线程池的简单介绍及代码示例

这里简单介绍有关项目中实践中使用的固定线程池的用法。

场景介绍

    在一个业务逻辑中需要同时生成7份合同(pdf)格式,在生成合同的同时,
    不仅需要调用一些外部接口去获取合同中的参数信息,而且还需要调用个人签章
    和企业签章去合同中生成。这样调用一个合同的时间就很长了,一个大概也需要3-4s,
    那么如果顺序执行7个,完成就需要20几s。这样接口响应就会需要很长时间来完成。

解决办法

    1/异步调用生成合同接口
    2/在异步调用接口的同时,采用线程池的方式同时创建7个线程去同时生成7个合同。
    这样既省时间又可以很快给用户作出响应。
ExecutorService executor = Executors.newFixedThreadPool(7);

        Future<Boolean> f = executor.submit(() -> {
            try{
                return generatePuchase(contractNo);

            }catch (Exception e){
                logger.error("生成咨询服务协议失败",e);
                return false;
            }
        });

        Future<Boolean> f1=executor.submit(() -> {
            try{
                return generateEntrustment(contractNo);
            }catch (Exception e){
                logger.error("生成划扣协议书失败",e);
                return false;
            }
        });

        Future<Boolean> f2=executor.submit(() -> {
            try{
                return  generatePromise(contractNo);
            }catch (Exception e){
                logger.error("生成用户承诺函失败",e);
                return  false;
            }

        });

        Future<Boolean> f3=executor.submit(() -> {
            try{
                return generateUserConfirm(contractNo);
            }catch (Exception e){
                logger.error("生成用户确认书失败",e);
                return  false;
            }
        });

        Future<Boolean> f4=executor.submit(() -> {
            try{
                return  generateTrust(contractNo);

            }catch (Exception e){
                logger.error("生成委托协议书失败",e);
                return  false;
            }
        });
        Future<Boolean> f5=executor.submit(() -> {
            try{
                return   generateHjConfirm(contractNo);

            }catch (Exception e){
                logger.error("生成用户确认书失败",e);
                return  false;
            }
        });

        Future<Boolean> f6=executor.submit(() -> {
            try{
                return  generateLend(contractNo);

            }catch (Exception e){
                logger.error("生成借款合同失败",e);
                return  false;
            }
        });


        for(;;){
            if(f.isDone() && f1.isDone() && f2.isDone() && f3.isDone() && f4.isDone() && f5.isDone() && f6.isDone()){
                try {
                    if(f.get() && f1.get() && f2.get() && f3.get() && f4.get() && f5.get() && f6.get() ){
                        //7个合同同时生成完成后再调用签约借款2
                        //调用签约接口
                        String signUrl=insideServiceUrl+CommonConstants.INSIDE_FR_SIGN_URL+orderId;
                        logger.info("调用签约地址为{}",signUrl);
                        CommonResponseResult commonResponseResult=oAuth2RestTemplate.getForObject(signUrl,CommonResponseResult.class);
                        if("00000".equals(commonResponseResult.getCode())){
                            logger.info("订单ID为{}调用签约接口成功",orderId);
                        }else if("99999".equals(commonResponseResult.getCode())){
                            logger.info("订单ID为{}调用签约接口失败",orderId);
                        }
                        break;
                    }

                } catch (InterruptedException e) {
                    logger.error("线程执行出错1",e);
                } catch (ExecutionException e) {
                    logger.error("线程执行出错2",e);

                }
            }
        }
简单解析:for循环需要持续循环等待7个线程全部执行完毕,
并且返回结果全部为true时才去调用签约接口。亲测没有问题,很快
GitHub 加速计划 / th / ThreadPool
7.74 K
2.22 K
下载
A simple C++11 Thread Pool implementation
最近提交(Master分支:2 个月前 )
9a42ec13 - 9 年前
fcc91415 - 9 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐