等待异步回调函数在java中返回

问题描述 投票:0回答:3
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())。在回调完成执行之前,如何防止执行此条件?

java asynccallback
3个回答
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方法,这样你可以对它做出反应,如果它需要太长时间。


0
投票

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

如果你想在回调后执行嵌套回调。


0
投票
  1. 您可以使用运行该函数时释放的CountDownLatchReentrantLock
  2. 您的foo#install可以返回CompletableFuture,您可以按如下方式使用结果
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> 1);
future.thenAccept((v) -> System.out.println("v = " + v));
  1. 函数本身有一个andThen方法,你可以用来运行apply后需要的任何东西。
© www.soinside.com 2019 - 2024. All rights reserved.