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相关推荐

  1. Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例

    2019独角兽企业重金招聘Python工程师标准>>> 原文地址:Guava库学习:学习Guava EventBus(二)EventBus 事件订阅示例 上一篇Guava库学习:学习 ...

  2. Spring MVC 学习总结(九)——Spring MVC实现RESTful与JSON(Spring MVC为前端提供服务)...

    Spring MVC 学习总结(九)--Spring MVC实现RESTful与JSON(Spring MVC为前端提供服务) 目录 一.JSON 1.1.概要 1.2.使用ModelAndView ...

  3. QT学习笔记(九):遍历容器-迭代器(iterators)

    QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...

  4. C++语言学习(十九)——C++类型识别

    C++语言学习(十九)--C++类型识别 一.C++类型识别简介 1.C++类型识别简介 C++是静态类型语言,其数据类型是在编译期就确定的,不能在运行时更改. C++语言中,静态类型是对象自身的类型 ...

  5. C++/C学习笔记(九)

    C++/C学习笔记(九) --学习和使用STL 1.STL简介 STL(Standard Template Library)是C++标准库的最主要和最重要的组成部分.STL是一个标准规范,只是为容器. ...

  6. 软件测试学习笔记(九)淘宝测试

    软件测试学习笔记(九)淘宝测试 视频链接:软件测试_中国大学MOOC 1.淘宝性能测试经历哪三个发展阶段?简述其工作内容. (1)业务发展-基础阶段 编写性能测试白皮书和测试文档,整理了常用性能测试的 ...

  7. 【STM32】标准库与HAL库对照学习教程八--串口通信详解

    [STM32]标准库与HAL库对照学习教程八--串口通信详解 一.前言 二.准备工作 三.通信的基本概念 1.通信方式 2.串行通信与并行通信 (1)串行通信 (2)并行通信 3.异步通信与同步通信 ...

  8. nrf52832 学习笔记(九)蓝牙主机发现服务

    nrf52832 学习笔记(九)蓝牙主机发现服务 服务发现流程 数据如同下表一样存储在服务端,客户端首先要获取表中的Handle和Type列,从而知道服务端中存在哪些数据,以便后面读.写.通知等操作. ...

  9. Guava RateLimter 基础学习

    Guava RateLimter 基础学习 平滑突发限流 平滑预热限流 原理分析--以平滑突发限流为例 缺点 结合Redis实现分布式 思路 平滑突发限流 public static void mai ...

最新文章

  1. core data 学习笔记
  2. css阴影3d效果,3D立体带阴影的CSS圆角效果
  3. SQL SERVER数据库中 是否可以对视图进行修改删除
  4. 收藏一下mybatis全局参数配置
  5. 权限表使用联合主键吗_天天写 order by,你知道Mysql底层执行流程吗?
  6. 如何快速的学习html5,高效快速学习HTML5的技巧
  7. python工作状态_[Python设计模式] 第16章 上班,干活,下班,加班——状态模式
  8. jeesite如何已生成数据的数据源_如何在postman中自动生成接口请求数据,这个功能你需要知道,可结合浏览器和两大抓包工具使用...
  9. Airflow 中文文档:Lineage
  10. linux后台执行脚本(产生日志和不产生日志)(大神请留言)
  11. sql语句与mysql_MySQL-sql语句
  12. 网络爬虫的基本原理(一)
  13. laravel 打包成zip并下载
  14. TTL电平信号和RS232信号波形对比
  15. 大学生数学竞赛资料目录20190403更新
  16. SpringBoot之整合thymeleaf渲染Web页面
  17. 如何制作企业在线产品手册?这里有一些简单的方法!
  18. 远程主机强迫关闭了一个现有的连接。请高手解答?
  19. oracle读取数字时添加小数或者加上分隔符
  20. 算法图解第十、十一章读书笔记

热门文章

  1. “我xx岁了,想学软件测试,现在转行来得及吗?”别再问了,这篇文章终结此类问题
  2. Java前端顺序,java种初始化顺序
  3. DenseNet论文
  4. 【java】窗口和流的应用
  5. 按clear按钮清空两个文本框的内容,按copy按钮时将Source文本框的内容复制到Target文本框,按close按钮结束程序的运行
  6. linux下各种文件设备,各硬件设备在Linux中的文件名
  7. 常见面试算法:k-近邻算法原理与python案例实现
  8. 社群数据分析:你运营的社群是好社群吗?
  9. java udp类_UDP及java中的类
  10. uwsgi模式_uwsgi配置详解