这是一个使用AtomicInteger实现的流控例子,后面还会有一篇使用Semaphore做流控的例子,具体看代码吧
package atomic;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
/**
* 使用原子变量实现流控
* 1s钟只允许调用10次
* */
public class CallController1 {
final static int MAX_QPS = 10;
final static AtomicInteger count = new AtomicInteger(MAX_QPS);
public static void main(String[] args) {
//启动一个线程,用于重置流控
new Thread(){
@Override
public void run(){
while(true){
try {
//1s运行1次
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//重置许可数量
count.set(MAX_QPS);
}
}
}.start();
//工作线程
ExecutorService e = Executors.newFixedThreadPool(100);
for(int i=0;i<100;i++){
final int no = i;
e.submit(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
while(count.getAndDecrement()>0){
remoteCall(no);
}
}
});
}
}
private static void remoteCall(int i) {
System.out.println(String.format("%s - %s: %d", new Date(),
Thread.currentThread(), i));
}
}