首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >芭乐限制器tryAcquire是否仅在第一次调用时返回true (任意数量的许可)?

芭乐限制器tryAcquire是否仅在第一次调用时返回true (任意数量的许可)?
EN

Stack Overflow用户
提问于 2015-12-09 08:24:24
回答 2查看 2.6K关注 0票数 3

我使用的是Guava 18.0 RateLimiter:

代码语言:javascript
复制
public static void simpleTst() throws Exception{
    RateLimiter lt = RateLimiter.create(2);
    _log.info("Acquired one " + lt.tryAcquire());
    _log.info("Acquired two " + lt.tryAcquire());
}

输出为:

代码语言:javascript
复制
: 08 16:22:10 PST.INFO1*RateLimiterTst~simpleTst@37: Acquired one true
: 08 16:22:10 PST.INFO1*RateLimiterTst~simpleTst@38: Acquired two false

指定要12的许可数量

代码语言:javascript
复制
public static void simpleTst() throws Exception{
    RateLimiter lt = RateLimiter.create(2);
    _log.info("Acquired one " + lt.tryAcquire(12));
    _log.info("Acquired two " + lt.tryAcquire());
}

输出为:

代码语言:javascript
复制
: 08 16:22:36 PST.INFO1*RateLimiterTst~simpleTst@37: Acquired one true
: 08 16:22:36 PST.INFO1*RateLimiterTst~simpleTst@38: Acquired two false

为什么会发生这种情况?

EN

回答 2

Stack Overflow用户

发布于 2015-12-09 08:45:39

第一个示例的行为是预期的,因为:

代码语言:javascript
复制
// we request 2 permit per seconds
RateLimiter lt = RateLimiter.create(2);
_log.info("Acquired one " + lt.tryAcquire());

// waiting 1/2 second we will be able to get the second permit
Thread.sleep(500);
_log.info("Acquired two " + lt.tryAcquire());

输出为:

代码语言:javascript
复制
Acquired one true
Acquired two true

从Guava文档中:

返回的RateLimiter确保在任何给定的一秒钟内发出的平均不超过permitsPerSecond,并且持续的请求被平滑地散布在每一秒的上。

第二个示例的行为也是意料之中的,因为为了在第二个“获取”时成功获得单个许可,我们需要等待大约6秒(= 12 / 2)。

代码语言:javascript
复制
// we request 2 permit per seconds
RateLimiter lt = RateLimiter.create(2);

// trying to acquire 12 permits
_log.info("Acquired one " + lt.tryAcquire(12));

// waiting 12 / 2 seconds in order to be able to get the second permit
Thread.sleep(6000);
_log.info("Acquired two " + lt.tryAcquire());

输出为:

代码语言:javascript
复制
Acquired one true
Acquired two true

尝试获取等待时间少于6秒的最后一个许可证将失败,这就是示例中的lt.tryAcquire()返回false的原因。

票数 8
EN

Stack Overflow用户

发布于 2016-08-27 09:03:08

如果您将应用程序休眠1毫秒,它将返回true和true。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34168675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档