zoukankan      html  css  js  c++  java
  • 线程池小计

    线程池的管理过程:首先创建一个线程池,然后根据任务的数量逐步将线程增大到corePoolSize,如果此时仍有任务增加,则放置到workQueue中,直到workQueue爆满为止,然后继续增加池中的线程数量(增强处理能力),最终达到maxinumPoolSize。那如果此时还有任务要增加进来呢?这就需要handler来处理了,或者丢弃新任务,或者拒绝新任务,或者挤占已有的任务。在任务队列和线程池都饱和的情况下,一旦有线程处于等待(任务处理完毕,没有新任务)状态的时间超过keepAliveTime,则该线程终止,也就是说池中的线程数量会逐渐降低,直至为corePoolSize数量为止。

    newFixedThreadPool 固定线程池使用

    场景介绍

        在一个业务逻辑中需要同时生成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时才去调用签约接口。亲测没有问题,很快
    其中的:Future.get()
    Waits if necessary for the computation to complete, and then retrieves its result.
     
  • 相关阅读:
    C#语法糖
    C#十种语法糖
    委托
    C#迭代器
    C#事件
    C#事件
    c# event 事件浅析
    ASP.NET CORE 增删改查
    asp.net core 增删改查
    asp.net core 搭建MVC
  • 原文地址:https://www.cnblogs.com/shz365/p/9186416.html
Copyright © 2011-2022 走看看