在java中,如何在for循环之前执行多个Future并等待它完成?

在java中,如何在for循环之前执行多个Future并等待它完成?,java,asynchronous,completable-future,callable,Java,Asynchronous,Completable Future,Callable,嗨,我如何执行3个可调用函数,这样我就不必在执行另一个进程时等待,在某种程度上,我将不得不等待它们完成,然后才能正确地移动到我的下一行代码?以下是我的工作: 我有一个返回值为可调用的函数: public <T> Callable<List<T>> getDataFromOtherAPI(List<Long> ids, String url, Class<T> tClass){ WebClient webClient = WebC

嗨,我如何执行3个可调用函数,这样我就不必在执行另一个进程时等待,在某种程度上,我将不得不等待它们完成,然后才能正确地移动到我的下一行代码?以下是我的工作:

我有一个返回值为可调用的函数:

public <T> Callable<List<T>> getDataFromOtherAPI(List<Long> ids, String url, Class<T> tClass){
    WebClient webClient = WebClient.create();

    //NOTE init mapper
    ObjectMapper mapper = new ObjectMapper()
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
    //NOTE end of init mapper

    CollectionType listType = mapper.getTypeFactory().constructCollectionType(ArrayList.class, tClass);

    List<T> object = webClient.post()
        .uri(url).body(Mono.just(ids), Object.class)
        .retrieve()
        .onStatus(HttpStatus::isError, res -> res.bodyToMono(ExceptionResponse.class)
                .onErrorResume(e -> Mono.error(new ResourceNotFound("Something Happened")))
                .flatMap(errorBody -> Mono.error(new ResourceNotFound(errorBody.getMessage())))
        )
        .bodyToMono(new ParameterizedTypeReference<List<T>>() {})
        .block();
    
    List<T> mappedClass = mapper.convertValue(object, listType);

    if(mappedClass.size() == 0) {
        throw new ResourceNotFound("Data in Url " + url + " not found");
    }

    return () -> mappedClass;
}
下面是我如何尝试从函数中的另一个api调用:

Future<List<PartnerDto>> initPartners = execs.submit(getDataFromOtherAPI(
            transDeliveryPlanningDtSoDtoPartnerIds, b2b.getPartnerSpecificId(), PartnerDto.class));
    
Future<List<PartnerShipmentDto>> initPartnerShipments = execs.submit(getDataFromOtherAPI(
            transDeliveryPlanningDtSoDtoPartnerShipmentIds, b2b.getPartnerShipmentSpecificId(), PartnerShipmentDto.class));
    
Future<List<ProductResponseDto>> initProduct = execs.submit(getDataFromOtherAPI(
            transDeliveryPlanningDtSoDetailDto, b2b.getProductSpecificId(), ProductResponseDto.class));
    
    //another much process
    
    //end of another much process
    
    //i have to hold over here before i continue into my next process to do some for loop :
    
    for(TransDeliveryPlanningDtSoDto e : d.getTransDeliveryPlanningDtSoDto()) {
                        
         PartnerDto latestPartner = new PartnerDto();
         PartnerShipmentDto latestPartnerShipment = new PartnerShipmentDto();
         TransSalesOrder latestSalesOrder = new TransSalesOrder();
        
         latestProduct = initProduct.stream().filter(so -> productId.equals(so.getId())).findAny().orElseThrow(() -> new ResourceNotFound("Product " + so.getIs() + " Not Found"));
         latestPartner = initPartners.stream().filter(partner -> partnerId.equals(partner.getId())).findAny().orElseThrow(() -> new ResourceNotFound("Partner " + partnerName + " Not Found"));
         latestPartnerShipment = initPartnerShipments.stream().filter(partnerShipment -> partnerShipmentId.equals(partnerShipment.getId())).findAny().orElseThrow(() -> new ResourceNotFound("PartnerShipment Not Found"));
        
        }
Future initPartners=execs.submit(getDataFromOtherAPI(
transDeliveryPlanningDtSoDtoPartnerIds,b2b.getPartnerSpecificId(),PartnerDto.class));
Future initPartnerShippings=execs.submit(getDataFromOtherAPI(
TransDeliveryPlanningDTSODTopartnerShipmentId,b2b.getPartnerShipmentSpecificId(),PartnerShipmentDto.class));
Future initProduct=execs.submit(getDataFromOtherAPI(
transDeliveryPlanningDtSoDetailDto,b2b.getProductSpecificId(),ProductResponseDto.class));
//另一个非常重要的过程
//另一个过程的结束
//在我继续进行下一个流程之前,我必须在这里停留,以执行一些for循环:
对于(TransDeliveryPlanningDtSoDto e:d.getTransDeliveryPlanningDtSoDto()){
PartnerDto latestPartner=新PartnerDto();
PartnerShipmentDto latestPartnershipping=新的PartnerShipmentDto();
TransSalesOrder latestSalesOrder=新TransSalesOrder();
latestProduct=initProduct.stream().filter(so->productId.equals(so.getId()).findAny().OrelsThrow(()->新资源未找到(“产品”+so.getIs()+“未找到”);
latestPartner=initPartners.stream().filter(partner->partnerId.equals(partner.getId()).findAny().orelsetrown(()->新资源未找到(“partner”+partnerName+“未找到”));
LatestPartnerShipping=initpartnerShipping.stream().filter(partnerShipping->partnerShipmentId.equals(partnerShipping.getId()).findAny().OrelsThrow(()->new ResourceNotFound(“partnerShipping未找到”);
}

我必须添加一些东西来保持/等待异步进程正确完成?如何执行此操作?

永远不要调用
block()
-只需将
Mono
转发到Spring-to平台即可。目前你正在返回一个callable,但是你正在做所有创建它的工作,而延迟执行本身就是一个no-op。因此,你尝试并行化将一事无成。你能给我举个例子吗?我使用WebClient是因为我读到RestTemplate在不久的将来将被弃用,这就是我决定这么做的原因。如果您简化它,这将更容易回答,因为有很多代码只有您知道。因为更简单的问题会引起更多的注意,imo。
Future<List<PartnerDto>> initPartners = execs.submit(getDataFromOtherAPI(
            transDeliveryPlanningDtSoDtoPartnerIds, b2b.getPartnerSpecificId(), PartnerDto.class));
    
Future<List<PartnerShipmentDto>> initPartnerShipments = execs.submit(getDataFromOtherAPI(
            transDeliveryPlanningDtSoDtoPartnerShipmentIds, b2b.getPartnerShipmentSpecificId(), PartnerShipmentDto.class));
    
Future<List<ProductResponseDto>> initProduct = execs.submit(getDataFromOtherAPI(
            transDeliveryPlanningDtSoDetailDto, b2b.getProductSpecificId(), ProductResponseDto.class));
    
    //another much process
    
    //end of another much process
    
    //i have to hold over here before i continue into my next process to do some for loop :
    
    for(TransDeliveryPlanningDtSoDto e : d.getTransDeliveryPlanningDtSoDto()) {
                        
         PartnerDto latestPartner = new PartnerDto();
         PartnerShipmentDto latestPartnerShipment = new PartnerShipmentDto();
         TransSalesOrder latestSalesOrder = new TransSalesOrder();
        
         latestProduct = initProduct.stream().filter(so -> productId.equals(so.getId())).findAny().orElseThrow(() -> new ResourceNotFound("Product " + so.getIs() + " Not Found"));
         latestPartner = initPartners.stream().filter(partner -> partnerId.equals(partner.getId())).findAny().orElseThrow(() -> new ResourceNotFound("Partner " + partnerName + " Not Found"));
         latestPartnerShipment = initPartnerShipments.stream().filter(partnerShipment -> partnerShipmentId.equals(partnerShipment.getId())).findAny().orElseThrow(() -> new ResourceNotFound("PartnerShipment Not Found"));
        
        }