Завершение Java 8 для цикла for, принудительно синхронизировать асинхронный или как цепочку - PullRequest
0 голосов
/ 05 ноября 2019

в настоящее время у меня есть требование сделать асинхронную задачу для синхронизации в завершаемом будущем. Например. Задача A и Задача B вполне достижимы в будущем. Задача B выполняется, когда задача A завершена. Это прекрасно работает в течение одного раза. Предположим, если я сделаю это для запуска в цикле foor, очевидно, он создаст n количество асинхронных вызовов для достижения результата. Из-за этого я получаю o / p, как показано ниже

A
B
A
A
B
B
A
B
A
A
A

Я хочу достичь, как

A
B
A
B
A
B
A
B

Вот код,

package com.demo.completable.combine;

import javax.xml.stream.Location;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class ThenCompose {

    synchronized CompletableFuture<User> getUserDetails(String name) {
        return CompletableFuture.supplyAsync(() -> {
            return UserService.getUser(name);
        });
    }

    synchronized CompletableFuture<Double> getRating(User user) {
        return CompletableFuture.supplyAsync(() -> {
            return CreditRating.getCreditRating(user);
        });
    }

     synchronized CompletableFuture<String> getResult(Double rating) {
        return CompletableFuture.supplyAsync(()-> {
            return "welcome world";
        });
    }

    public void main() throws InterruptedException, ExecutionException {

        ThenCompose cc = new ThenCompose();

        // then apply

        CompletableFuture<CompletableFuture<Double>> result = cc.getUserDetails("kumaran").thenApply(user -> {
            return cc.getRating(user);
        });

        // then compose

        for (int i = 1; i <= 15; i++) {

        CompletableFuture<Double> taskA = cc.getUserDetails("mike").thenCompose(user -> {
                    System.out.println("Task A --- " +Thread.currentThread().getName() + "--" + LocalTime.now());
                    return cc.getRating(user);

        });

        CompletableFuture<String> fileLocation =
                taskA.thenCompose(ts -> {
                        System.out.println("Task B --- " +Thread.currentThread().getName() + "--- " + LocalTime.now());
                        return getResult(ts);



        });
        }

    }

    public static void main(String[] args) throws ExecutionException, InterruptedException {
            ThenCompose tc = new ThenCompose();
            tc.main();
    }

}

положив соединение и получить будет работать, но я не должен использовать как присоединиться и получить. Пожалуйста, предложите решение.

ниже приведен мой фрагмент кода использования,

CompletableFuture<HttpResponse<FileResponseModel>> createdFileResponse = null;

//assume contains 5 files in filesList
 for (MyFile myFile : filesList) {
            final MyFile myFileModel = myFile;
            if(null == createdFileResponse) {
                System.out.println("inside new if loop");
                createdFileResponse = getFileToInsert(attributesList,
                        myFileModel.getProfile(), myFileModel.getFile()).
                            thenCompose(fileModelResponse->{
                                //below line will make a request to api
                                 return fileFlow.createfileModelResponse(getLinks(), fileModelResponse,
                                        authToken);

                            });
            } else {
                System.out.println("check new else loop ");
                createdFileResponse = createdFileResponse.thenCompose(unused -> {
                    getFileToInsert(attributesList,
                        myfileModelResponse.getProfile(), myfileModelResponse.getFile(),UrlResponse,
                        myfileModelResponse.getHashPair(), startTimeCode, skipChecksForFile).
                            thenCompose(fileModelResponse->{
                                //below line will make a request to api
                                 return fileFlow.createfileModelResponse(getLinks(), fileModelResponse,
                                        authToken);

                            });
                });

                });

            }

1 Ответ

0 голосов
/ 05 ноября 2019

Пожалуйста, попробуйте ниже код, который выполняет задачи в последовательности. Это даст вам ожидаемый результат.

static Integer methA(int seq) {
    System.out.println("A-"+seq);
    return seq;
}
static Integer methB(int seq) {
    System.out.println("B-"+seq);
    return seq;
}
public static void main(String[] args) throws InterruptedException, ExecutionException {
    System.out.println("Main started:");
    CompletableFuture<Integer> ft = null;
    for(int a=0;a<15;a++) {
        final int seq = a;
        if(ft==null) {
            ft = CompletableFuture.supplyAsync(()->methA(seq))
                    .thenApply(s->methB(s));
        }else {
            ft.thenApply((s)->methA(seq))
            .thenApply(s->methB(s));
        }
    }
    ft.thenAccept(s->System.out.println("Thread completed..."+s));
    System.out.println("Main ended:");
}
...