有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何异步设置值并在稍后阶段获取

我希望异步设置变量的值。接下来,我希望在稍后阶段获得该值。我该怎么做?这就是我目前为实现这一目标所做的。这是一个正确的实现,还是我应该去追求一个完美的未来

当进行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) 个答案

  1. # 1 楼答案

    依我看,有了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