【问题标题】:Wait for the async callback function to return in java等待异步回调函数在java中返回
【发布时间】:2019-08-03 05:59:05
【问题描述】:
final Function<Boolean, ? extends Class<Void>> functionCallback = (Boolean t) -> {
   if(t) {
     plugin.setIsInstalled(Boolean.TRUE);             
   }
   return Void.TYPE;
};

foo.install(plugin,functionCallback);

if(plugin.getIsInstalled().getValue())
  return "done";
else 
  return "not done";

我想在回调完成执行后检查if(plugin.getIsInstalled().getValue())。在回调完成执行之前,如何防止执行此 if 条件?

【问题讨论】:

  • getIsInstalled的返回类型是什么?
  • javafx 包的布尔属性。此属性设置在回调函数中,一旦回调完成执行,我想访问该函数

标签: java asynccallback


【解决方案1】:

您可以使用在回调函数中调用的FutureTask

final FutureTask<Object> ft = new FutureTask<Object>(() -> {}, new Object());
final Function<Boolean, ? extends Class<Void>> functionCallback = (Boolean t) -> {
    if(t) {
        plugin.setIsInstalled(Boolean.TRUE);
        ft.run();
    }
    return Void.TYPE;
};

foo.install(plugin,functionCallback); 
ft.get();
if(plugin.getIsInstalled().getValue())
    return "done";
else 
    return "not done";

Future.get 等到 run 方法被调用,您也可以使用接受超时的get-方法,以便在超时时做出反应。

【讨论】:

    【解决方案2】:
    1. 您可以使用在函数运行时释放的CountDownLatchReentrantLock
    2. 您的foo#install 可以返回CompletableFuture,您可以按如下方式使用结果
    CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1);
    future.thenAccept((v) -> System.out.println("v = " + v));
    
    1. 函数本身有一个andThen 方法,您可以使用它来运行apply 后所需的任何内容。

    【讨论】:

      【解决方案3】:

      回调主要用于在特定任务完成后执行任务。因此,最好将要执行的代码分离到调用该函数的不同函数中。

      如果你想在回调之后执行一些事情,有嵌套的回调。

      【讨论】:

        猜你喜欢
        • 2013-07-24
        • 2011-03-04
        • 1970-01-01
        • 2018-01-03
        • 1970-01-01
        • 2014-11-26
        • 2012-05-04
        • 1970-01-01
        • 2020-08-19
        相关资源
        最近更新 更多