posts

CompletableFuture.allOf(XXX).join();

使用 CompletableFuture.allOf 等待多个异步任务全部完成后继续执行的代码示例。

public class Demo5 {
    public static void main(String[] args) {
        long time = System.currentTimeMillis();

        Map<String,Object> map = new ConcurrentHashMap<>();
        CompletableFuture.allOf(
                CompletableFuture.runAsync(() -> {
                    ThreadTool.printTimeAndThread("业务1开始执行了");
                    ThreadTool.sleepMillis(200);
                    map.put("1","执行完成");
                }),
                CompletableFuture.runAsync(() -> {
                    ThreadTool.printTimeAndThread("业务2开始执行了");
                    ThreadTool.sleepMillis(200);
                    map.put("2","执行完成");
                }),
                CompletableFuture.runAsync(() -> {
                    ThreadTool.printTimeAndThread("业务3开始执行了");
                    ThreadTool.sleepMillis(200);
                    map.put("3","执行完成");
                })
        ).join();

        long ms = System.currentTimeMillis() - time;
        System.out.println("办法总消耗时:" + ms + " ms");
        System.out.println(map.toString());

    }
}
    @Override
    public List<Map<String, Object>> analysisSum(String bizDate) {
        List<Map<String, Object>> all= new CopyOnWriteArrayList<>();
        CompletableFuture.allOf(
                CompletableFuture.supplyAsync(() -> 
											  dirtyDataGroupDAO.queryDirtyDataAnalysisSumA(bizDate), 
											  commonThreadPool).thenApply(data -> all.addAll(data)),
                CompletableFuture.supplyAsync(() -> dirtyDataGroupDAO.queryDirtyDataAnalysisSumB(bizDate),
											  commonThreadPool).thenApply(data -> all.addAll(data)),
                CompletableFuture.supplyAsync(() -> dirtyDataGroupDAO.queryDirtyDataAnalysisSumC(bizDate),
											  commonThreadPool).thenApply(data -> all.addAll(data)),
                CompletableFuture.supplyAsync(() ->{map
                    Map<String, Object> map=new HashMap<>();
                    map.put("id","1");
                    map.put("label","现存脏数据总量");
                    map.put("pic","./assets/zlsjl.svg");
                    map.put("num",num);
                    map.put("unit","");
                    return map;
                },commonThreadPool).
                        thenApply(data -> all.add(data))
        ).join();
        return all;
    }
List<CompletableFuture> futureAll = allSumEvtCdOs.stream().map(cdoList ->
 CompletableFuture.supplyAsync(() -> 
		 monSetlTcsNoclrSetldService.deleteNoclrSetlAndFund(cdoList.stream().map(data -> {
	 String strValue = data.getFixmedinsCode() + "-" + data.getFeeClrId() + "-" + data.getEvtsn();
	 boolean locking = AsyncLockTcsUtil.
		 islocking(TcsCacheConst.ASYNC_LOCK_ASYNC_INSERTLIQUIDATIONINFO_PRODUCER + timeStrKey, strValue);
	 if (locking) {
		 throw new RuntimeException("locking");
	 }
	 AsyncLockTcsUtil.lockMin(TcsCacheConst.ASYNC_LOCK_ASYNC_INSERTLIQUIDATIONINFO_PRODUCER + timeStrKey, strValue);
	 LiquNedUIDTO lieuNeedDTO = new LiquNedUIDTO();
	 lieuNeedDTO.setSemaphore(semaphore);
	 BeanUtils.copyProperties(data, lieuNeedDTO, LiquNedUIDTO.class);
	 return lieuNeedDTO;
 }).collect(Collectors.toList()), timeStrKey), commonThreadPool)).collect(Collectors.toList());
CompletableFuture.allOf(futureAll.toArray(new CompletableFuture[0])).join();
@PostMapping("/executeMethod")
  private String executeMethod(){
    String bizDate = DateUtil.getCurrentDate_String("yyyy-MM-dd");
    List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
    List<Map<String, Object>> mapList = dirtyDataGroupService.analysisSort(bizDate);
    mapList.forEach(data->synchronizedList.add(String.valueOf(data.get("SUBSYS_CODG"))));
    List<CompletableFuture> futureAll = synchronizedList.stream().map(subsysCodg ->
    CompletableFuture.supplyAsync(() -> dirtyDataGroupService.analysisBar(bizDate, subsysCodg)
    , commonThreadPool)).collect(Collectors.toList());
    CompletableFuture.allOf(futureAll.toArray(new CompletableFuture[0])).join();
    return "SUCCESS";
  }