代码实现
- 注释
-
/** * join()方法只能用于等待当前`CompletetableFuture` 的异步任务完成并返回值,如果还有其他异步任务需要等待,并发执行, * 需要每个`CompletableFuture`调用一次`.join()`方法,这样会导致代码很冗长。 * * .allOf().join()方法可以等待多个`CompletableFuture`都执行完之后再返回结果。 * 这是因为,`allOf()`方法接收一个`CompletableFuture`数组或可变参数,并返回一个新的`CompletableFuture`, * 该`CompletableFuture`将在所有输入所有`CompletableFuture`完成后完成。 * 调用`allOf().join()`方法可以等待该`CompletableFuture`完成并返回结果。 * 所以`.allOf().join()`方法更加适用于等待多个异步任务并行执行的情况。 * * 因此,如果只有一个异步任务,可以使用`.join()`方法;测试:平均1.8s左右 * 如果有多个异步任务,可以使用`.allOf().join()`方法。测试:平均2.0s左右 */
- 代码示例
-
public PteIntermediateHttpVo getIntermediate1(PteIntermediateParam pteIntermediateParam) throws ExecutionException, InterruptedException { //使用CompletableFuture构建异步任务 CompletableFuture<PteIntermediateHttpVo.Protect> protectFuture = CompletableFuture.supplyAsync(() -> { Map<String, String> param = new HashMap<>(); String paramJson = JSONObject.toJSONString(param); JSONObject queryProtectLogic = HttpClientUtil.sendPostByJson(ProcessTechnologyHttpUrlEnum.QUERY_PROTECT_LOGIC.getUrl(), null, paramJson); if (null != queryProtectLogic) { String protectResult = queryProtectLogic.getString("result"); logger.info("_protectResult:" + protectResult); JSONObject protectDataJson = JSONObject.parseObject(protectResult); String protectData = protectDataJson.getString("data"); logger.info("_protectData:" + protectData); return JSONObject.parseObject(protectData, PteIntermediateHttpVo.Protect.class); } return null; }); /** * 此处可调用多个接口方法,方法同上 */ CompletableFuture<List<PteIntermediateHttpVo.OperationalChangesDetail>> operationalChangesDetailListFuture = CompletableFuture.supplyAsync(() -> { Map<String, String> flangeMetaParam = new HashMap<>(); flangeMetaParam.put("depLevel", pteIntermediateParam.getDepLevel() == null ? "" : pteIntermediateParam.getDepLevel()); flangeMetaParam.put("unitName", pteIntermediateParam.getUnitName() == null ? "" : pteIntermediateParam.getUnitName()); flangeMetaParam.put("changeDate", pteIntermediateParam.getChangeDate()); flangeMetaParam.put("count", pteIntermediateParam.getCount()); String operationDayDetailParamJson = JSONObject.toJSONString(flangeMetaParam); JSONObject queryOperationDayDetail = HttpClientUtil.sendPostByJson(ProcessTechnologyHttpUrlEnum.QUERY_OPERATION_DAY_DETAIL.getUrl(), null, operationDayDetailParamJson); if (null != queryOperationDayDetail) { String queryOperationDayDetailResult = queryOperationDayDetail.getString("result"); logger.info("_queryOperationDayDetailResult:" + queryOperationDayDetailResult); JSONObject queryOperationDayDetailJson = JSONObject.parseObject(queryOperationDayDetailResult); String queryOperationDayDetailData = queryOperationDayDetailJson.getString("data"); logger.info("_queryOperationDayDetailData:" + queryOperationDayDetailData); return JSONObject.parseArray(queryOperationDayDetailData, PteIntermediateHttpVo.OperationalChangesDetail.class); } return new ArrayList<>(); }); /*//等待所有异步任务执行完成 PteIntermediateHttpVo.Protect finalProtect = protectFuture.join(); PteIntermediateHttpVo.Protect finalSecurity = securityFuture.join(); PteIntermediateHttpVo.OperationalChanges finalBlindPlate = blindPlateFuture.join(); PteIntermediateHttpVo.OperationalChanges finalFlange = flangeFuture.join(); PteIntermediateHttpVo.OperationalChanges finalApplyNozzle = applyNozzleFuture.join(); PteIntermediateHttpVo.OperationalChanges finalOperationalChanges = operationalChangesFuture.join(); List<PteIntermediateHttpVo.OperationalChangesDetail> finalOperationalChangesDetailList = operationalChangesDetailListFuture.join(); return new PteIntermediateHttpVo() {{ setProtect(finalProtect); setSecurity(finalSecurity); setBlindPlate(finalBlindPlate); setFlange(finalFlange); setApplyNozzle(finalApplyNozzle); setOperationalChanges(finalOperationalChanges); setOperationalChangesDetailList(finalOperationalChangesDetailList); }};*/ //等待所有异步任务执行完成 CompletableFuture.allOf( protectFuture, securityFuture, blindPlateFuture, flangeFuture, applyNozzleFuture, operationalChangesFuture, operationalChangesDetailListFuture ).join(); //构建响应对象 return new PteIntermediateHttpVo(){{ setProtect(protectFuture.get()); setSecurity(securityFuture.get()); setBlindPlate(blindPlateFuture.get()); setFlange(flangeFuture.get()); setApplyNozzle(applyNozzleFuture.get()); setOperationalChanges(operationalChangesFuture.get()); setOperationalChangesDetailList(operationalChangesDetailListFuture.get()); }}; }