Java token bucket rate limiter class
Java
public final class TokenBucket {
private final int capacity;
private final double refillPerNano;
private double tokens;
private long last = System.nanoTime();
public TokenBucket(int capacity, double perSecond) {
this.capacity = capacity;
this.tokens = capacity;
this.refillPerNano = perSecond / 1_000_000_000d;
}
public synchronized boolean tryAcquire() {
long now = System.nanoTime();
tokens = Math.min(capacity, tokens + (now - last) * refillPerNano);
last = now;
if (tokens < 1) return false;
tokens -= 1;
return true;
}
}