前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一句话ListenableFuture简介

一句话ListenableFuture简介

作者头像
MickyInvQ
发布2020-09-27 10:39:01
1.1K0
发布2020-09-27 10:39:01
举报
文章被收录于专栏:InvQ的专栏
ListenableFuture

并发是一个难问题,但是通过强有力和简单的抽象,可以简化。为了使问题简化,Guava 使用了JDK 的ListenableFuture接口。 这里强烈推荐诸位使用ListenableFuture而不是Future。原因有如下三点:

  • 大多数的Future方法需要ListenableFuture
  • 切换到ListenableFuture很容易
  • 工具方法的提供者不需要提供Future以及ListenableFuture他们方法的变体。
Interface

一个传统的Future代表着一个异步计算(computation,下文都将用计算指代)的结果,什么样的计算呢?它有可能已经完成了计算并返回结果,也有可能至今还没完成。一个Future可以是一个内部计算的handle,一个提供我们结果的服务的承诺。

一个ListenableFuture可以让你注册一个回调函数,一旦计算完毕,就会执行它。或者,这个任务早已经执行完毕,那就立刻执行这个回调函数。ListenableFuture增加了这一项简单的功能,就可以高效的支持到许多基础的Future无法支持的操作。

ListenableFuture的基本操作就是addListener(Runnable, Executor)方法,它指定了当这个Future代表的计算执行完成,指定的Runnable将会被指定的Executor运行。

增加回调函数

大多数的程序员倾向于使用Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor),或者是默认使用MoreExecutors.directExecutor()的版本,callback函数使用起来更加快捷方便。使用FutureCallback<V>需要你实现两个方法:

  • onSuccess(V) ,当future执行成功,则执行此方法
  • onFailure(Throwable),当future执行失败,则执行此方法
创建

根据JDK的 ExecutorService.submit(Callable)这个方法的返回,可以初始化一个异步的计算future,Guava 提供了ListeningExecutorService接口,这个接口无论在ExecutorService的哪里返回一个正常的Future,都会返回一个ListenableFuture,将ExecutorService 转化为 ListeningExecutorService,很简单:MoreExecutors.listeningDecorator(ExecutorService).

代码语言:javascript
复制
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture<Explosion> explosion = service.submit(new Callable<Explosion>() {
  public Explosion call() {
    return pushBigRedButton();
  }
});
Futures.addCallback(explosion, new FutureCallback<Explosion>() {
  // we want this handler to run immediately after we push the big red button!
  public void onSuccess(Explosion explosion) {
    walkAwayFrom(explosion);
  }
  public void onFailure(Throwable thrown) {
    battleArchNemesis(); // escaped the explosion!
  }
});

如果你是基于FutureTask来转化的的,你可以选择Guava提供的ListenableFutureTask.create(Callable<V>)ListenableFutureTask.create(Runnable, V)

应用

使用ListenableFutureTask最重要的一个理由是,对异步操作可以有复杂的调用链。

代码语言:javascript
复制
ListenableFuture<RowKey> rowKeyFuture = indexService.lookUp(query);
AsyncFunction<RowKey, QueryResult> queryFunction =
  new AsyncFunction<RowKey, QueryResult>() {
    public ListenableFuture<QueryResult> apply(RowKey rowKey) {
      return dataService.read(rowKey);
    }
  };
ListenableFuture<QueryResult> queryFuture =
    Futures.transformAsync(rowKeyFuture, queryFunction, queryExecutor);

https://github.com/google/guava/wiki/ListenableFutureExplained

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Interface
  • 增加回调函数
  • 创建
  • 应用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档