Java 如何异步设置值并在稍后阶段获取
我希望异步设置变量的值。接下来,我希望在稍后阶段获得该值。我该怎么做?这就是我目前为实现这一目标所做的。这是一个正确的实现,还是我应该去追求一个完美的未来 当进行rest调用时,这是第一个被调用的方法之一Java 如何异步设置值并在稍后阶段获取,java,java.util.concurrent,completable-future,Java,Java.util.concurrent,Completable Future,我希望异步设置变量的值。接下来,我希望在稍后阶段获得该值。我该怎么做?这就是我目前为实现这一目标所做的。这是一个正确的实现,还是我应该去追求一个完美的未来 当进行rest调用时,这是第一个被调用的方法之一 public class A{ @Autowired private Helper helper; private final ExecutorService executor = Executors.newFixedThreadPool(10); pub
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
}
}
}
公共A类{
@自动连线
私人佣工;
private final executor Service executor=Executors.newFixedThreadPool(10);
公共空间第一步(模型){
MyObj MyObj=model.MyObj;
//decrypt()返回一个字符串
Future futureNumber=executor.submit(()->helper.decrypt());
myObj.setFutureNumber(futureNumber);
}
}
//过了一段时间,我们来到了下面的方法,我们来到了各种其他的类/方法
//现在我需要值myObj.getFutureNumber()。
公共B级{
公共空间第二步(模型){
//模型现在应该具有值100
MyObj MyObj=model.MyObj;
最终字符串编号=null;
试一试{
myObj.setNumber(myObj.getFutureNumber().get());
}捕捉(中断异常e){
e、 printStackTrace();
}捕获(执行例外){
e、 printStackTrace();
}
if(myObj.getNumber()==100){
//做点什么
}
}
}
我是MyObj
public class MyObj{
private String number;
private Future<String> futureNumber;
// get set methods
}
公共类MyObj{
私有字符串编号;
私人未来号码;
//获取集方法
}
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
public CompletableFuture setNumberAsync(){
返回CompletableFuture.SupplySync(()->helper.decrypt())
.thenCombine(在重置编号()之前的步骤)(编号,型号)->{
MyObj MyObj=model.MyObj;
myObj.设置编号(编号);
if(myObj.getNumber()==100){
//做点什么
}
收益模型;
});
}
公共CompletableFuture步骤在重置编号()之前{
//转到其他各种类/方法
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
public CompletableFuture setNumberAsync(){
返回CompletableFuture.SupplySync(()->helper.decrypt())
.thenCombine(在重置编号()之前的步骤)(编号,型号)->{
MyObj MyObj=model.MyObj;
myObj.设置编号(编号);
if(myObj.getNumber()==100){
//做点什么
}
收益模型;
});
}
公共CompletableFuture步骤在重置编号()之前{
//转到其他各种类/方法