zoukankan      html  css  js  c++  java
  • SpringBoot线程池,@Async 注解。实现主线程等待所有子线程执行完毕再结束。(转)

    原文地址:https://blog.csdn.net/sgl520lxl/article/details/119757232

            log.info("---主线程开始");
            List<Future> futureList = new ArrayList<>();
     
            List<VideoInfoDTO> videos = specsConfig.getVideos();
            if (CollectionUtils.isNotEmpty(videos)) {
                videos.forEach(video ->{
                    Future future = videoCheckService.videoCheck(video,jsonVO.get());
                    futureList.add(future);
                });
            }
            Set<String> msgResult = new HashSet<>();
            while (true) {
                if (CollectionUtils.isNotEmpty(futureList)) {
                    boolean isAllDone = true;
                    for (Future future : futureList) {
                        if (null == future || !future.isDone()) {
                            isAllDone = false;
                        }else {
                            try {
                                String msg =  (String) future.get();
                                if (StringUtils.isNotEmpty(msg)) {
                                    msgResult.add(msg);
                                }
                            } catch (Exception e) {
                                log.info("---视频校验线程池处理单个视频校验出错!error:{}",ErrorUtils.errInfo(e));
                            }
                        }
                    }
                    if (isAllDone) {
                        break;
                    }
                }
            }
            log.info("---主线程结束");
        @Override
        @Async("checkVideoExecutor")
        public Future videoCheck(VideoInfoDTO videoInfo, SpecsConfigJsonVO vo){
     
            String msg = "视频:" + videoInfo.getVideoName();
            boolean pass = true;
            //校验规格
            VideoInfoVo infoVo = mediaService.getVideoInfo(videoInfo.getVideoId());
            if (!Optional.ofNullable(infoVo).isPresent()) {
                msg = msg + ",查询不到上传视频信息!";
                return new AsyncResult(msg);
            }
            if (vo.getFileSizeUpperLimit() != null && !BigDecimal.ZERO.equals(vo.getFileSizeUpperLimit())) {
                int fileSizeUpper =  getFireSize(vo,2);
                if (infoVo.getFileSize().intValue() > fileSizeUpper) {
                    msg = msg + "文件大小大于最大文件大小!";
                    pass = false;
                }
            }
            if (pass){
                return new AsyncResult("");
            }else {
                return new AsyncResult(msg);
            }
        }

    videoCheckService 的 videoCheck方法相当于是执行子线程逻辑的一个方法,使用了线程池注解@Async。

    大体逻辑就是每个子线程方法都会有一个返回对象Future,然后主线程代码逻辑里有一个while循环再一直判断所有的子线程是否已经全部完成了,完成了那么主线程再开始走下一步
    ————————————————
    版权声明:本文为CSDN博主「着实着迷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/sgl520lxl/article/details/119757232

  • 相关阅读:
    trackr: An AngularJS app with a Java 8 backend – Part III
    trackr: An AngularJS app with a Java 8 backend – Part II
    21. Wireless tools (无线工具 5个)
    20. Web proxies (网页代理 4个)
    19. Rootkit detectors (隐形工具包检测器 5个)
    18. Fuzzers (模糊测试器 4个)
    16. Antimalware (反病毒 3个)
    17. Debuggers (调试器 5个)
    15. Password auditing (密码审核 12个)
    14. Encryption tools (加密工具 8个)
  • 原文地址:https://www.cnblogs.com/huanghongbo/p/15411702.html
Copyright © 2011-2022 走看看