本文主要研究一下leaky bucket算法的實現算法
public class LeakyBucket { private final long capacity; private final long leaksIntervalInMillis; private double used; private long lastLeakTimestamp; public LeakyBucket(long capacity, long leaksIntervalInMillis) { this.capacity = capacity; this.leaksIntervalInMillis = leaksIntervalInMillis; this.used = 0; this.lastLeakTimestamp = System.currentTimeMillis(); } synchronized public boolean tryConsume(int drop) { leak(); if (used + drop > capacity) { return false; } used = used + drop; return true; } private void leak() { long currentTimeMillis = System.currentTimeMillis(); if (currentTimeMillis > lastLeakTimestamp) { long millisSinceLastLeak = currentTimeMillis - lastLeakTimestamp; long leaks = millisSinceLastLeak / leaksIntervalInMillis; if(leaks > 0){ if(used <= leaks){ used = 0; }else{ used -= (int)leaks; } this.lastLeakTimestamp = currentTimeMillis; } } } }