guava笔记三: Concurrency 简单介绍

guava笔记三: Concurrency 简单介绍

Guava Concurrency是什么

Concurrency是一个很困难的问题,但是可以使用抽象的方法大大简化使用。Guava继承Future接口,定义了接口ListenableFuture

Guava官方建议尽量使用ListenableFuture来代替Future,因为:
* Future大多数方法Listenable可以适用
* 后期再使用ListenableFuture比较麻烦
* 不需要根据FutureListenableFuture的差异增加工具类.

ListenableFutureFuture的区别是什么

从接口来看,主要增加了addListener方法,用来实现当future完成的时候,就使用Executor来执行runable

Guava Concurrency支持的callback

如果简单实用,那么可以使用默认的MoreExecutors.sameThreadExecutor()。不过更多可以选择的是Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor).一个FutureCallback<V>主要实现两个方法:
*
onSuccess(V),成功之后做什么
*
onFailure(Throwable)`失败了做什么

创建方法

对应于JDK本身的ExecutorService.submit(Callable)方式创建异步计算,返回以恶搞Future,Guava提供了一个ListeningExecutorService接口,返回ListenableFutre.可以使用MoreExecutors.listeningDecorator(ExecutorService)ExecutorService转化成ListeningExecutorService.

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();//escape the explosion
  }
});
应用场景

使用ListenableFuture最主要的场景就是异步执行chain.

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);

ListenableFuture的其他方法:

MethodDescription
transformAsync(ListenableFuture<A>, AsyncFunction<A, B>, Executor)*返回一个新的ListenableFuture,并且它的参数是使用AsyncFunction(ListenableFuture)的结果。
transform(ListenableFuture<A>, Function<A, B>, Executor)这个是非异步的function计算结果作为参数的ListenableFuture
allAsList(Iterable<ListenableFuture<V>>)返回一个ListenableFuture,结果是输入的future.当一个失败或者取消,就会停止了.不太理解
successfulAsList(Iterable<ListenableFuture<V>>)这个是把failed和cancelled的future结果替换成null,不会停止
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值