Guava库学习:学习Concurrency(九)RateLimiter
2019独角兽企业重金招聘Python工程师标准>>>
链接地址:http://www.xx566.com/detail/164.html
上一篇,Guava库学习:学习Concurrency(八)Futures中,我们学习了Futures工具类用于操作Future实例,通过Futures,我们可以很简单的进行并发的编程,本篇我们继续Guava Concurrency的学习,Concurrency(九)RateLimiter,RateLimiter 类与Java api中的semaphore信号量比较类似,主要用于限制对资源并发访问的线程数,RateLimiter类限制线程访问的时间,这就意味着可以限制每 秒中线程访问资源的数量,接下来,我们开始Guava Concurrency RateLimiter的学习。
我们可以通过下面的方式创建RateLimiter实例,如下:
RateLimiter limiter = RateLimiter.create(4.0);
上面的代码中,我们通过RateLimiter类提供的静态create方法,传入一个double类型的参数4.0,这就意味着每秒不超过4个任务被提 交。当我们要限制线程访问的时间时,我们需要用到RateLimiter类,我们可以使用和JDK信号量相同的方式进行操作,向下面这样:
limiter.acquire();
executor.submit(new Callable<Object>() {@Overridepublic Object call() throws Exception {return "Hello RateLimiter";}
});
在上面的代码中,我们调用了acquire方法,在获取允许访问资源的许可之前,线程会阻塞, 如果我们不希望当前线程阻塞,我们可以这样调用:
if(limiter.tryAcquire()){//有资源访问的许可System.out.println("someThing");
}else{//没有资源访问的许可System.out.println("anotherThing");
}
上面的例子中,我们调用了tryAcquire方法,判断是否拥有资源访问的许可, 如果没有许可的话,将立即执行anotherThing部分的代码。tryAcquire方法有另外重载的方法,我们可以设置特定的超时时间,具体的方法我们将在下面的介绍中说明。
翻开RateLimiter的源码,我们简单的整理一下其中的公共方法,如下:
create(double permitsPerSecond):创建具有指定稳定吞吐量的RateLimiter类,传入允许每秒提交的任务数量。
create(double permitsPerSecond, long warmupPeriod, TimeUnit unit):创建具有指定稳定吞吐量的RateLimiter类,传入允许每秒提交的任务数量和准备阶段的时间,在这段时间RateLimiter会有个缓冲,直到达到它的最大速率(只要有饱和的足够的请求)。
setRate(double permitsPerSecond):稳定的更新RateLimiter的速率,RateLimiter的构造方法中中设置permitsPerSecond参数,调用这个方法后,当前阻塞的线程不会被唤醒,因此它们不会观察到新的速率被设置。
getRate():返回RateLimiter被设置的稳定的速率值。
acquire():从这个ratelimiter获得一个许可,阻塞线程直到请求可以再授予许可。
acquire(int permits):获取传入数量的许可,阻塞线程直到请求可以再授予许可。
tryAcquire(long timeout, TimeUnit unit):判断是否可以在指定的时间内从ratelimiter获得一个许可,或者在超时期间内未获得许可的话,立即返回false。
tryAcquire(int permits):判断是否可以立即获取相应数量的许可。
tryAcquire():判断是否可以立即获取许可。
tryAcquire(int permits, long timeout, TimeUnit unit):判断是否可以在超时时间内获取相应数量的许可。
代码地址:http://git.oschina.net/realfighter/xx566-diary/blob/master/src/guava/RateLimiterTest.java
转载于:https://my.oschina.net/realfighter/blog/350024
Guava库学习:学习Concurrency(九)RateLimiter相关推荐
- Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例
2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...
- Spring MVC 学习总结(九)——Spring MVC实现RESTful与JSON(Spring MVC为前端提供服务)...
Spring MVC 学习总结(九)--Spring MVC实现RESTful与JSON(Spring MVC为前端提供服务) 目录 一.JSON 1.1.概要 1.2.使用ModelAndView ...
- QT学习笔记(九):遍历容器-迭代器(iterators)
QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...
- C++语言学习(十九)——C++类型识别
C++语言学习(十九)--C++类型识别 一.C++类型识别简介 1.C++类型识别简介 C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改. C++语言中,静态类型是对象自身的类型 ...
- C++/C学习笔记(九)
C++/C学习笔记(九) --学习和使用STL 1.STL简介 STL(Standard Template Library)是C++标准库的最主要和最重要的组成部分.STL是一个标准规范,只是为容器. ...
- 软件测试学习笔记(九)淘宝测试
软件测试学习笔记(九)淘宝测试 视频链接:软件测试_中国大学MOOC 1.淘宝性能测试经历哪三个发展阶段?简述其工作内容. (1)业务发展-基础阶段 编写性能测试白皮书和测试文档,整理了常用性能测试的 ...
- 【STM32】标准库与HAL库对照学习教程八--串口通信详解
[STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...
- nrf52832 学习笔记(九)蓝牙主机发现服务
nrf52832 学习笔记(九)蓝牙主机发现服务 服务发现流程 数据如同下表一样存储在服务端,客户端首先要获取表中的Handle和Type列,从而知道服务端中存在哪些数据,以便后面读.写.通知等操作. ...
- Guava RateLimter 基础学习
Guava RateLimter 基础学习 平滑突发限流 平滑预热限流 原理分析--以平滑突发限流为例 缺点 结合Redis实现分布式 思路 平滑突发限流 public static void mai ...
最新文章
- core data 学习笔记
- css阴影3d效果,3D立体带阴影的CSS圆角效果
- SQL SERVER数据库中 是否可以对视图进行修改删除
- 收藏一下mybatis全局参数配置
- 权限表使用联合主键吗_天天写 order by,你知道Mysql底层执行流程吗?
- 如何快速的学习html5,高效快速学习HTML5的技巧
- python工作状态_[Python设计模式] 第16章 上班,干活,下班,加班——状态模式
- jeesite如何已生成数据的数据源_如何在postman中自动生成接口请求数据,这个功能你需要知道,可结合浏览器和两大抓包工具使用...
- Airflow 中文文档:Lineage
- linux后台执行脚本(产生日志和不产生日志)(大神请留言)
- sql语句与mysql_MySQL-sql语句
- 网络爬虫的基本原理(一)
- laravel 打包成zip并下载
- TTL电平信号和RS232信号波形对比
- 大学生数学竞赛资料目录20190403更新
- SpringBoot之整合thymeleaf渲染Web页面
- 如何制作企业在线产品手册?这里有一些简单的方法!
- 远程主机强迫关闭了一个现有的连接。请高手解答?
- oracle读取数字时添加小数或者加上分隔符
- 算法图解第十、十一章读书笔记
热门文章
- “我xx岁了,想学软件测试,现在转行来得及吗?”别再问了,这篇文章终结此类问题
- Java前端顺序,java种初始化顺序
- DenseNet论文
- 【java】窗口和流的应用
- 按clear按钮清空两个文本框的内容,按copy按钮时将Source文本框的内容复制到Target文本框,按close按钮结束程序的运行
- linux下各种文件设备,各硬件设备在Linux中的文件名
- 常见面试算法:k-近邻算法原理与python案例实现
- 社群数据分析:你运营的社群是好社群吗?
- java udp类_UDP及java中的类
- uwsgi模式_uwsgi配置详解