Listenablefuture 与 Completablefuture
Listenablefuture vs Completablefuture
我试了很多,但没有找到任何文章或博客清楚地比较 ListenableFuture
和 CompletableFuture
,并提供很好的分析。
因此,如果有人可以向我解释或指出这样的博客或文章,那对我来说真的很棒。
ListenableFuture 和 CompletableFuture 都优于其父级 class Future 通过允许调用者以一种或另一种方式 "register" 在异步操作完成时调用回调。
使用 Future 你可以这样做:
ExecutorService executor = ...;
Future f = executor.submit(...);
f.get();
f.get()
被阻塞,直到异步操作完成。
使用 ListenableFuture 你可以像这样注册一个回调:
ListenableFuture listenable = service.submit(...);
Futures.addCallback(listenable, new FutureCallback<Object>() {
@Override
public void onSuccess(Object o) {
//handle on success
}
@Override
public void onFailure(Throwable throwable) {
//handle on failure
}
})
使用 CompletableFuture 您还可以注册回调
任务已完成,但它与 ListenableFuture 的不同之处在于它可以从任何希望它完成的线程完成。
CompletableFuture completableFuture = new CompletableFuture();
completableFuture.whenComplete(new BiConsumer() {
@Override
public void accept(Object o, Object o2) {
//handle complete
}
}); // complete the task
completableFuture.complete(new Object())
当线程对任务调用 complete 时,如果任务尚未完成,则通过调用 get() 收到的值将设置为参数值。
Guava AbstractFuture 有其局限性:
Listener 是列表,但通常只使用 1 个 - 矫枉过正。如果需要多个监听器,在下一阶段处理,或者考虑消息传递。
setException 将 return 值设置为 Exception,因此用户必须像 guava AbstractFuture 那样在 get()
处使用 instanceof 来区分 Exception 与否。
在 Future 管道中,层数过多addListener()
代码难以阅读。
我更喜欢CompletableFuture.supply().thenApply().thenAccept().handle()
我试了很多,但没有找到任何文章或博客清楚地比较 ListenableFuture
和 CompletableFuture
,并提供很好的分析。
因此,如果有人可以向我解释或指出这样的博客或文章,那对我来说真的很棒。
ListenableFuture 和 CompletableFuture 都优于其父级 class Future 通过允许调用者以一种或另一种方式 "register" 在异步操作完成时调用回调。
使用 Future 你可以这样做:
ExecutorService executor = ...;
Future f = executor.submit(...);
f.get();
f.get()
被阻塞,直到异步操作完成。
使用 ListenableFuture 你可以像这样注册一个回调:
ListenableFuture listenable = service.submit(...);
Futures.addCallback(listenable, new FutureCallback<Object>() {
@Override
public void onSuccess(Object o) {
//handle on success
}
@Override
public void onFailure(Throwable throwable) {
//handle on failure
}
})
使用 CompletableFuture 您还可以注册回调 任务已完成,但它与 ListenableFuture 的不同之处在于它可以从任何希望它完成的线程完成。
CompletableFuture completableFuture = new CompletableFuture();
completableFuture.whenComplete(new BiConsumer() {
@Override
public void accept(Object o, Object o2) {
//handle complete
}
}); // complete the task
completableFuture.complete(new Object())
当线程对任务调用 complete 时,如果任务尚未完成,则通过调用 get() 收到的值将设置为参数值。
Guava AbstractFuture 有其局限性:
Listener 是列表,但通常只使用 1 个 - 矫枉过正。如果需要多个监听器,在下一阶段处理,或者考虑消息传递。
setException 将 return 值设置为 Exception,因此用户必须像 guava AbstractFuture 那样在
get()
处使用 instanceof 来区分 Exception 与否。在 Future 管道中,层数过多
addListener()
代码难以阅读。
我更喜欢CompletableFuture.supply().thenApply().thenAccept().handle()