博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Guava并发:ListenableFuture与RateLimiter示例
阅读量:6840 次
发布时间:2019-06-26

本文共 3220 字,大约阅读时间需要 10 分钟。

hot3.png

概念

        ListenableFuture顾名思义就是可以监听的Future,它是对java原生Future的扩展增强。我们知道Future表示一个异步计算任务,当任务完成时可以得到计算结果。如果我们希望一旦计算完成就拿到结果展示给用户或者做另外的计算,就必须使用另一个线程不断的查询计算状态。这样做,代码复杂,而且效率低下。使用ListenableFuture Guava帮我们检测Future是否完成了,如果完成就自动调用回调函数,这样可以减少并发程序的复杂度。      

        推荐使用第二种方法,因为第二种方法可以直接得到Future的返回值,或者处理错误情况。本质上第二种方法是通过调动第一种方法实现的,做了进一步的封装。

另外ListenableFuture还有其他几种内置实现:

  1. SettableFuture:不需要实现一个方法来计算返回值,而只需要返回一个固定值来做为返回值,可以通过程序设置此Future的返回值或者异常信息

  2. CheckedFuture: 这是一个继承自ListenableFuture接口,他提供了checkedGet()方法,此方法在Future执行发生异常时,可以抛出指定类型的异常。

    RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程数,本文介绍RateLimiter使用

代码示例

import java.util.concurrent.Callable;import java.util.concurrent.ExecutionException;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit;import com.google.common.util.concurrent.FutureCallback;import com.google.common.util.concurrent.Futures;import com.google.common.util.concurrent.ListenableFuture;import com.google.common.util.concurrent.ListeningExecutorService;import com.google.common.util.concurrent.MoreExecutors;import com.google.common.util.concurrent.RateLimiter;public class ListenableFutureDemo {	public static void main(String[] args) {		testRateLimiter();		testListenableFuture();	}	/**	 * RateLimiter类似于JDK的信号量Semphore,他用来限制对资源并发访问的线程数	 */	public static void testRateLimiter() {		ListeningExecutorService executorService = MoreExecutors				.listeningDecorator(Executors.newCachedThreadPool());		RateLimiter limiter = RateLimiter.create(5.0); // 每秒不超过4个任务被提交		for (int i = 0; i < 10; i++) {			limiter.acquire(); // 请求RateLimiter, 超过permits会被阻塞			final ListenableFuture
 listenableFuture = executorService .submit(new Task("is "+ i)); } } public static void testListenableFuture() { ListeningExecutorService executorService = MoreExecutors .listeningDecorator(Executors.newCachedThreadPool()); final ListenableFuture
 listenableFuture = executorService .submit(new Task("testListenableFuture")); //同步获取调用结果 try { System.out.println(listenableFuture.get()); } catch (InterruptedException e1) { e1.printStackTrace(); } catch (ExecutionException e1) { e1.printStackTrace(); } //第一种方式 listenableFuture.addListener(new Runnable() { @Override public void run() { try { System.out.println("get listenable future's result " + listenableFuture.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } } }, executorService); //第二种方式 Futures.addCallback(listenableFuture, new FutureCallback
() { @Override public void onSuccess(Integer result) { System.out .println("get listenable future's result with callback " + result); } @Override public void onFailure(Throwable t) { t.printStackTrace(); } }); }}class Task implements Callable
 { String str; public Task(String str){ this.str = str; } @Override public Integer call() throws Exception { System.out.println("call execute.." + str); TimeUnit.SECONDS.sleep(1); return 7; }}

Guava版本

com.google.guava
guava
14.0.1

转载于:https://my.oschina.net/cloudcoder/blog/359598

你可能感兴趣的文章
linux下socket编程
查看>>
android中解压文件
查看>>
如何进行大数据分析及处理?
查看>>
runtime运行时编程一些相关知识
查看>>
转基因和基因突变
查看>>
git 使用经验
查看>>
shell脚本参数"$10"问题
查看>>
GSM协议编号及其内容
查看>>
mac下的抓包工具Charles
查看>>
iOS 四种保存数据的方式!
查看>>
innodb和myisam
查看>>
内存数据库服务运营之路
查看>>
UIBubbleTableView
查看>>
UIMenuController的使用,对UILabel拷贝以及定制菜单
查看>>
docker配置国内镜像源
查看>>
jeecg3.5.2中上传下载文件的示例中的的一个bug
查看>>
React-Native原理及生命周期
查看>>
IOS单例
查看>>
在Linux上编译LLVM/Clang 8.0.0等全部源代码
查看>>
IP协议和路由
查看>>