JUC学习之AtomicInteger

这是一个使用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));
    }
}


你可能感兴趣的:(JUC学习之AtomicInteger)