在下面的代码中,我将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) {
}
});
答案 0 :(得分:1)
2
FutureCallback
将由我添加它们的订单执行,或者将执行 它们分开和异步运行
首先,重要的是要注意Callback
实例和监听器在Future
完成后立即触发。
注意:如果回调很慢或重量级,请考虑提供 遗嘱执行人。如果您不提供执行人,
addCallback
将使用 直接执行人,对于较重的操作有一些警告。 例如,回调可能在不可预测或不合需要的情况下运行 螺纹:
- 如果输入的Future在调用
addCallback
时完成,addCallback
将执行内联回调。- 如果输入的Future尚未完成,
addCallback
将调度回调由完成输入Future的线程运行, 这可能是一个内部系统线程,如RPC网络线程。另请注意,无论哪个线程执行回调,都是如此 其他已注册但未执行的听众被禁止跑步 在执行期间,即使那些听众要在其他人中运行 执行者。强>
您可以通过在添加它们时提供单独的Executor
来控制它们是否单独运行(或者相同但是合并)。如果你不这样做,那行为是不可预测的,就像javadoc所说的那样。
(这是来自Guava的更新版本,但我认为它也适用于旧版本。)