Java并发限流工具

    xiaoxiao2021-03-25  93

    /** * * @author chichaofan * */ public class SimpleRateLimiter implements RateLimiter { private AtomicLong atomPermit; private long maxPermit; private long interval; private long lastTime; public SimpleRateLimiter(long permit, int intervalTime, TimeUnit t) { atomPermit = new AtomicLong(permit); interval = t.toNanos(intervalTime); maxPermit = permit; } @Override public void acquire(long tryPermit) { boolean rs = tryAcquire(tryPermit); if (rs) return; boolean interrupted =false; try{ long end = lastTime + interval; while (true) { try { NANOSECONDS.sleep((end - System.nanoTime())); rs = tryAcquire(tryPermit); if (rs) return; } catch (InterruptedException e) { interrupted = true; } } }finally{ if (interrupted) { Thread.currentThread().interrupt(); } } } @Override public boolean tryAcquire(long tryPermit) { if (System.nanoTime() > (lastTime + interval)) { atomPermit.set(maxPermit); lastTime = System.nanoTime(); } long value = atomPermit.get(); boolean rs = false; while (value > 0 && !rs) { rs = atomPermit.compareAndSet(value, value - tryPermit); value = atomPermit.get(); } return rs; } public static void main(String[] args) { final RateLimiter r = new SimpleRateLimiter(2, 1000, TimeUnit.MILLISECONDS); new Thread(new Runnable() { public void run() { while (true) { r.acquire(1); System.out.println(Thread.currentThread().getName()+"true"); } } }).start(); new Thread(new Runnable() { public void run() { while (true) { r.acquire(1); System.out.println(Thread.currentThread().getName()+"true"); } } }).start(); new Thread(new Runnable() { public void run() { while (true) { r.acquire(1); System.out.println(Thread.currentThread().getName()+"true"); } } }).start(); } }
    转载请注明原文地址: https://ju.6miu.com/read-25980.html

    最新回复(0)