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));
    }
}


转载于:https://my.oschina.net/sharkbobo/blog/267404

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值