当前位置: 代码迷 >> 综合 >> SpringBoot线程池,@Async 注解。实现主线程等待所有子线程执行完毕再结束。
  详细解决方案

SpringBoot线程池,@Async 注解。实现主线程等待所有子线程执行完毕再结束。

热度:67   发布时间:2024-01-22 03:43:38.0
        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循环再一直判断所有的子线程是否已经全部完成了,完成了那么主线程再开始走下一步