使用令牌桶的思想实现了一个简单的限流器,直接上代码:
package com.alex.util;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @author Alex
*/
public class Limiter {
public static void main(String[] args) {
Limiter limiter = new Limiter();
new Thread(()->{limiter.doWork();}).start();
new Thread(()->{limiter.doWork();}).start();
new Thread(()->{limiter.doWork();}).start();
}
private static final int POOL_SIZE = 10;
private static final AtomicInteger left = new AtomicInteger(POOL_SIZE);
static {
Thread thread = new Thread(() -> {
while (true) {
if (left.get() < POOL_SIZE) {
left.addAndGet(1);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread.setDaemon(true);
thread.start();
}
private static synchronized boolean getToken() {
if (left.get() > 0) {
left.addAndGet(-1);
return true;
} else {
return false;
}
}
private static final AtomicInteger count = new AtomicInteger(0);
private void doWork() {
while (true) {
if (getToken()) {
System.out.println("拿到令牌,开始第" +count.addAndGet(1)+ "次开活儿!当前令牌还剩" + left.get());
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}