Как установить значение асинхронно и получить его на более позднем этапе - PullRequest
1 голос
/ 23 сентября 2019

Я хочу установить значение переменной асинхронно.После этого я хочу получить это значение на более позднем этапе.Как я могу это сделать?Это то, что я сейчас делаю, чтобы добиться этого.Это правильная реализация или я должен был пойти на CompletableFuture?

Когда выполняется вызов rest, это один из первых вызываемых методов.

public class A{

    @Autowired
    private Helper helper;

    private final ExecutorService executor = Executors.newFixedThreadPool(10);

    public void stepOne(Model model) {

        MyObj myObj = model.myObj;
        // helper.decrypt() returns a String
        Future<String> futureNumber = executor.submit(() -> helper.decrypt());
        myObj.setFutureNumber(futureNumber);
    }
}

// coming to following method after awhile going to various other classes / methods 
// now I need the value myObj.getFutureNumber(). 

public class B{
    public void stepTwo(Model model) {

        // model should now have the value 100
        MyObj myObj = model.myObj;
        final String number = null;

        try{
            myObj.setNumber(myObj.getFutureNumber().get());
        }catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        if(myObj.getNumber() == 100){
            // do something
        }
    }
} 

Это MyObj

public class MyObj{
    private String number;
    private Future<String> futureNumber;
    // get set methods
}

1 Ответ

0 голосов
/ 25 сентября 2019

IMO, с CompletableFuture вы можете установить число асинхронно намного проще.Вот один из возможных способов:

public CompletableFuture<Model> setNumberAsync() {
    return CompletableFuture.supplyAsync(() -> helper.decrypt())
            .thenCombine(stepsBeforeSettingNumber(), (number, model) -> {
                MyObj myObj = model.myObj;
                myObj.setNumber(number);
                if (myObj.getNumber() == 100) {
                    // do something
                }
                return model;
            });
}

public CompletableFuture<Model> stepsBeforeSettingNumber() {
    //  going to various other classes / methods 

...