多线程应用

先看下线程池具体使用小栗子:

public class Test {
     public static void main(String[] args) {   
         ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
                 new ArrayBlockingQueue<Runnable>(5));
          
         for(int i=0;i<15;i++){
             MyTask myTask = new MyTask(i);
             executor.execute(myTask);
             System.out.println("线程池中线程数目:"+executor.getPoolSize()+",队列中等待执行的任务数目:"+
             executor.getQueue().size()+",已执行玩别的任务数目:"+executor.getCompletedTaskCount());
         }
         executor.shutdown();
     }
}
 
 
class MyTask implements Runnable {
    private int taskNum;
     
    public MyTask(int num) {
        this.taskNum = num;
    }
     
    @Override
    public void run() {
        System.out.println("正在执行task "+taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task "+taskNum+"执行完毕");
    }
}

项目实践小栗子:

public BillMessagePage<SysOrCustomerTotalBalanceVo> selectCustomerAssetsGroupByUser(SysAssetsParams sysAssetsParams) {
    long startTime = System.currentTimeMillis();
    List<SysOrCustomerTotalBalanceVo> sysOrCustomerTotalBalanceVoList = new CopyOnWriteArrayList<>();
    List<Long> userIds = getSysUser();
    List<String> subSystem = getSubSystem();
    Set<Long> userAllIds = new HashSet<>();
    List<Long> allCustomerIds = new CopyOnWriteArrayList<>();
    for (String string : subSystem) {
        String[] strings = string.split("-");
        Integer accountType = Integer.valueOf(strings[0].toUpperCase());
        String accountParam = strings[1].toUpperCase();
        List<Long> customerIds = billCoinUserPropertyMapper.selectUserIds(accountType, accountParam);
        userAllIds.addAll(customerIds);
    }
    // 过滤掉系统用户信息
    userAllIds.removeAll(userIds);
    if (Objects.isNull(sysAssetsParams.getUserId())) {
        // 默认全部查询
        allCustomerIds.addAll(userAllIds);
    } else {
        // 按搜索条件查询
        // userId 不为空
        userAllIds.removeAll(userAllIds);
        userAllIds.add(sysAssetsParams.getUserId());
        allCustomerIds.addAll(userAllIds);
    }
    logger.info("userAllIds size={}", userAllIds.size());
    // 初始化线程池
    ExecutorService pool = Executors.newFixedThreadPool(subSystem.size());
    // 初始化计数器
    CountDownLatch latch = new CountDownLatch(subSystem.size());
    Integer coinId = sysAssetsParams.getCoinId();
    AssetsBillConfig assetsBillConfig = assetsBillConfigMapper.selectMinCheckOkTime();
    Date checkOkTime = assetsBillConfig.getCheckOkTime();
    for (String string : subSystem) {
        String[] strings = string.split("-");
        Integer accountType = Integer.valueOf(strings[0].toUpperCase());
        String accountParam = strings[1].toUpperCase();
        pool.submit(new Runnable() {
            @Override
            public void run() {
                try {
                    List<BillCoinUserProperty> billCoinUserPropertyList = new CopyOnWriteArrayList<>();
                    List<BillCoinUserProperty> billCoinUserProperties = new CopyOnWriteArrayList<>();
                    List<SysOrCustomerTotalBalanceVo> list = new CopyOnWriteArrayList<>();
                    if (AccountTypeEnum.SWAP_MAIN.getIntegerCode().equals(accountType)) {
                        // bill_coin_property_
                        for (Long userId : allCustomerIds) {
                            List<BillCoinUserProperty> contractList = billCoinUserPropertyMapper.selectSingleUser(userId, coinId, accountType, accountParam, checkOkTime);
                            billCoinUserProperties.addAll(contractList);
                        }
                        if (CollectionUtils.isNotEmpty(billCoinUserProperties)) {
                            Map<Integer, List<BillCoinUserProperty>> map = billCoinUserProperties.stream().collect(Collectors.groupingBy(BillCoinUserProperty::getCoinId));
                            for (Map.Entry<Integer, List<BillCoinUserProperty>> entry : map.entrySet()) {
                                SysOrCustomerTotalBalanceVo sysOrCustomerTotalBalanceVo = new SysOrCustomerTotalBalanceVo();
                                List<BillCoinUserProperty> billCoinUserPropertyLists = entry.getValue();
                                BigDecimal contract = billCoinUserPropertyLists.stream().map(BillCoinUserProperty::getProp1).reduce(BigDecimal.ZERO, BigDecimal::add);
                                sysOrCustomerTotalBalanceVo.setCoinId(billCoinUserPropertyLists.get(0).getCoinId());
                                sysOrCustomerTotalBalanceVo.setBalance(contract);
                                ContractConfigVo contractConfigVo = ContractConfigUtils.getProductConfig(accountParam.toLowerCase());
                                if (!Objects.isNull(contractConfigVo)) {
                                    String productName = contractConfigVo.getProductName();
                                    sysOrCustomerTotalBalanceVo.setAccountType(productName);
                                }
                                list.add(sysOrCustomerTotalBalanceVo);
                            }
                        }
                    } else {
                        // bill_coin_property_
                        for (Long userId : allCustomerIds) {
                            // 从bill_user_ 中查询check_ok_time
                            BillUser billUser = billUserMapper.selectBySingleUserId(userId, accountType, accountParam);
                            if (Objects.isNull(billUser)) {

                            } else {
                                List<BillCoinUserProperty> spotOtcList = billCoinUserPropertyMapper.selectSingleUser(userId, coinId, accountType, accountParam, billUser.getCheckOkTime());
                                billCoinUserPropertyList.addAll(spotOtcList);
                            }
                        }
                        if (CollectionUtils.isNotEmpty(billCoinUserPropertyList)) {
                            Map<Integer, List<BillCoinUserProperty>> map = billCoinUserPropertyList.stream().collect(Collectors.groupingBy(BillCoinUserProperty::getCoinId));
                            for (Map.Entry<Integer, List<BillCoinUserProperty>> entry : map.entrySet()) {
                                SysOrCustomerTotalBalanceVo sysOrCustomerTotalBalanceVo = new SysOrCustomerTotalBalanceVo();
                                List<BillCoinUserProperty> billCoinProperties = entry.getValue();
                                sysOrCustomerTotalBalanceVo.setCoinId(billCoinProperties.get(0).getCoinId());
                                sysOrCustomerTotalBalanceVo.setBalance(selectTotalAssets(billCoinProperties));
                                if (AccountTypeEnum.SPOT.getIntegerCode().equals(accountType)) {
                                    sysOrCustomerTotalBalanceVo.setAccountType(AccountTypeEnum.SPOT.getDesc());
                                } else if (AccountTypeEnum.OTC.getIntegerCode().equals(accountType)) {
                                    sysOrCustomerTotalBalanceVo.setAccountType(AccountTypeEnum.OTC.getDesc());
                                }
                                list.add(sysOrCustomerTotalBalanceVo);
                            }
                        }
                    }
                    // 按照不同业务系统分组
                    Map<Integer, List<SysOrCustomerTotalBalanceVo>> map = list.stream().collect(Collectors.groupingBy(SysOrCustomerTotalBalanceVo::getCoinId));
                    for (Map.Entry<Integer, List<SysOrCustomerTotalBalanceVo>> entry : map.entrySet()) {
                        List<SysOrCustomerTotalBalanceVo> sysOrCustomerTotalBalanceVos = entry.getValue();
                        SysOrCustomerTotalBalanceVo sysOrCustomerTotalBalanceVo = new SysOrCustomerTotalBalanceVo();
                        BigDecimal coinBalance = sysOrCustomerTotalBalanceVos.stream().map(SysOrCustomerTotalBalanceVo::getBalance).reduce(BigDecimal.ZERO, BigDecimal::add);
                        sysOrCustomerTotalBalanceVo.setBalance(coinBalance);
                        sysOrCustomerTotalBalanceVo.setCoinId(sysOrCustomerTotalBalanceVos.get(0).getCoinId());
                        sysOrCustomerTotalBalanceVo.setShowBalance(coinBalance.setScale(8, BigDecimal.ROUND_DOWN).toPlainString());
                        sysOrCustomerTotalBalanceVo.setAccountType(getAccountTypeName(accountType,accountParam));
                        sysOrCustomerTotalBalanceVo.setCoinName(selectCoinName(sysOrCustomerTotalBalanceVo.getCoinId()));
                        sysOrCustomerTotalBalanceVoList.add(sysOrCustomerTotalBalanceVo);
                    }
                } catch (Exception e) {
                    logger.error("exception", e);
                } finally {
                    // 线程结束-1
                    latch.countDown();
                }
            }
        });
        // List<SysOrCustomerTotalBalanceVo> list = selectSingleSystem(sysAssetsParams, allCustomerIds);
        // sysOrCustomerTotalBalanceVoList.addAll(list);
    }
    try {
        // 等待所有线程结束
        latch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    pool.shutdown();
    // List<SysOrCustomerTotalBalanceVo> coinList = selectBalanceGroupByCoinId(sysOrCustomerTotalBalanceVoList);
    // 分页
    BillMessagePage<SysOrCustomerTotalBalanceVo> billMessagePage = selectPaging(sysAssetsParams.getPageNo(), sysAssetsParams.getPageSize(), sysOrCustomerTotalBalanceVoList);
    long endTime = System.currentTimeMillis();
    System.out.println("程序运行时间:" + (endTime - startTime) + "ms");
    logger.info("startTime = {},endTime = {},allAssets time = {}",startTime,endTime,endTime - startTime);
    return billMessagePage;
}

使用多线程程序运行时间缩短近三倍,注意arrayList是线程不安全的,要使用线程安全的copyOnWriteList,多个线程之间不可以共用同一个对象,会造成线程不安全

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值