private static RateLimiter one=RateLimiter.create(2);//每秒2个
private static RateLimiter two=RateLimiter.create(2);//每秒2个
private RateLimitUtil(){};
public static void acquire(RateLimiter r,int num){
double time =r.acquire(num);
System.out.println("wait time="+time);
}
public static void main(String[] args) throws InterruptedException {
acquire(one,1);
acquire(one,1);
acquire(one,1);
System.out.println("-----");
acquire(two,10);
acquire(two,1);
}
wait time=0.0 wait time=0.499163 wait time=0.489308 ----- wait time=0.0 wait time=4.497819
public double acquire(int permits) {
long microsToWait = reserve(permits);//先计算获取这些请求需要让线程等待多长时间
stopwatch.sleepMicrosUninterruptibly(microsToWait);//让线程阻塞microTowait微秒长的时间
return 1.0 * microsToWait / SECONDS.toMicros(1L);//返回阻塞的时间
}
final long reserve(int permits) {
checkPermits(permits);//检查参数是否合法
synchronized (mutex()) {
return reserveAndGetWaitLength(permits, stopwatch.readMicros());
}
}
↓
↓
↓
final long reserveAndGetWaitLength(int permits, long nowMicros) {
long momentAvailable = reserveEarliestAvailable(permits, nowMicros);
return max(momentAvailable - nowMicros, 0);
}
↓
↓
↓
final long reserveEarliestAvailable(int requiredPermits, long nowMicros) {
resync(nowMicros);//here
long returnValue = nextFreeTicketMicros;
double storedPermitsToSpend = min(requiredPermits, this.storedPermits);
double freshPermits = requiredPermits - storedPermitsToSpend;
long waitMicros = storedPermitsToWaitTime(this.storedPermits, storedPermitsToSpend)
+ (long) (freshPermits * stableIntervalMicros);
this.nextFreeTicketMicros = nextFreeTicketMicros + waitMicros;
this.storedPermits -= storedPermitsToSpend;
return returnValue;
}
private void resync(long nowMicros) {
// if nextFreeTicket is in the past, resync to now
if (nowMicros > nextFreeTicketMicros) {
storedPermits = min(maxPermits,
storedPermits + (nowMicros - nextFreeTicketMicros) / stableIntervalMicros);
nextFreeTicketMicros = nowMicros;
}
}
final long reserveEarliestAvailable(int requiredPermits, long nowMicros) { //1
resync(nowMicros); //2
long returnValue = nextFreeTicketMicros;//3
double storedPermitsToSpend = min(requiredPermits, this.storedPermits);//4
double freshPermits = requiredPermits - storedPermitsToSpend;//5
long waitMicros = storedPermitsToWaitTime(this.storedPermits, storedPermitsToSpend)
+ (long) (freshPermits * stableIntervalMicros);//6
this.nextFreeTicketMicros = nextFreeTicketMicros + waitMicros;//7
this.storedPermits -= storedPermitsToSpend;//8
return returnValue;//9
}
final long reserveAndGetWaitLength(int permits, long nowMicros) {
long momentAvailable = reserveEarliestAvailable(permits, nowMicros);
return max(momentAvailable - nowMicros, 0);//取较大的值
}
public double acquire(int permits) {
long microsToWait = reserve(permits);
stopwatch.sleepMicrosUninterruptibly(microsToWait);
return 1.0 * microsToWait / SECONDS.toMicros(1L);
}
private static RateLimiter too=RateLimiter.create(2);//每秒2个
private RateLimitUtil(){};
public static void acquire(RateLimiter r,int num){
double time =r.acquire(num);
System.out.println("wait time="+time);
}
public static void main(String[] args) throws InterruptedException {
acquire(too,1);
acquire(too,10);//只等待了0.5秒就获取了10个
acquire(too,10);//等待了5秒就获取了10个
acquire(too,1);//虽然只获取1个,也是等待5秒
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有