本文主要是介绍java令牌桶,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
public class RateLimit {
private long bucketSize;
private double currentNum;
private double rate;
// 最后一次加水时间
private long lastTime;
private Lock lock;
public static RateLimit create(long ticketPerSecond) {
RateLimit rateLimit = new RateLimit();
rateLimit.bucketSize = ticketPerSecond;
rateLimit.currentNum = 0;
rateLimit.rate = ticketPerSecond;
rateLimit.lastTime = System.currentTimeMillis();
rateLimit.lock = new ReentrantLock();
return rateLimit;
}
public boolean tryAcquire() {
try {
lock.lock();
long curTime = System.currentTimeMillis();
this.currentNum = Math.max(0, currentNum - (curTime - lastTime) * rate / 1000);
lastTime = curTime;
if (bucketSize - currentNum >= 1) {
currentNum++;
return true;
} else {
return false;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return false;
}
public static void main(String[] args) {
final RateLimit rateLimit = create(5);
while (true) {
System.out.println(rateLimit.tryAcquire() + " - " + Thread.currentThread().getId() + " - " + System.currentTimeMillis() + " - " + rateLimit.currentNum);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
这篇关于java令牌桶的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!