FutureCallbacks是否被添加到异步执行的ListenableFuture中?

时间:2014-10-15 16:00:57

标签: java asynchronous guava

在下面的代码中,我将2个FutureCallback添加到一个ListenableFuture中。

我的问题是:2个FutureCallbacks会按我添加它们的顺序执行,还是会单独和异步运行?

JavaDoc说,注册将在Future计算完成时运行的成功和失败回调,或者如果计算已经完成,则立即执行。 没有保证执行回调的顺序,但是通过这种方法添加的任何回调都可以保证在计算完成后被调用。

我试图将Thread.sleep(1000)添加到其中一个FutureCallbacks中,然后我发现它阻止了另一个,这让我很困惑。

我还尝试过addListener方法,它是异步运行的,这是肯定的。

ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
final ListenableFuture<String> future = service.submit(new Callable<String>() {
  @Override
  public String call() throws Exception {
    return "hello";
  }
});

Futures.addCallback(future, new FutureCallback<String>() {
  @Override
  public void onSuccess(String result) {
    System.out.println(result+ " world");
  }

  @Override
  public void onFailure(Throwable t) {
  }
});

Futures.addCallback(future, new FutureCallback<String>() {
  @Override
  public void onSuccess(String result) {
    System.out.println(result+ " me");
  }

  @Override
  public void onFailure(Throwable t) {
  }
});

1 个答案:

答案 0 :(得分:1)

  

2 FutureCallback将由我添加它们的订单执行,或者将执行   它们分开和异步运行

首先,重要的是要注意Callback实例和监听器在Future完成后立即触发。

javadoc

  

注意:如果回调很慢或重量级,请考虑提供   遗嘱执行人。如果您不提供执行人,addCallback将使用   直接执行人,对于较重的操作有一些警告。   例如,回调可能在不可预测或不合需要的情况下运行   螺纹:

     
      
  • 如果输入的Future在调用addCallback时完成, addCallback将执行内联回调
  •   
  • 如果输入的Future尚未完成,addCallback将调度回调由完成输入Future的线程运行,   这可能是一个内部系统线程,如RPC网络线程。
  •   
     

另请注意,无论哪个线程执行回调,都是如此   其他已注册但未执行的听众被禁止跑步   在执行期间,即使那些听众要在其他人中运行   执行者。

您可以通过在添加它们时提供单独的Executor来控制它们是否单独运行(或者相同但是合并)。如果你不这样做,那行为是不可预测的,就像javadoc所说的那样。

(这是来自Guava的更新版本,但我认为它也适用于旧版本。)