如何手写一个令牌桶

如何手写一个令牌桶算法

要实现流量的控制,必须有一种机制可以对通过设备的流量进行度量。令牌桶(Token-Bucket)是目前最常采用的一种流量测量方法,用来评估流量速率是否超过了规定值。这里的令牌桶是指网络设备的内部存储池,而令牌则是指以给定速率填充令牌桶的虚拟信息包。

令牌桶可以看作是一个存放令牌的容器,预先设定一定的容量。系统按设定的速度向桶中放置令牌,当桶中令牌满时,多余的令牌溢出。令牌桶只是一种流量测量方法,并不能对流量进行过滤或采取某种措施,比如说丢弃数据包等,这些操作由其他功能完成,而且令牌桶中装的是令牌而不是报文分组。
令牌桶示意图

var foo = 'bar';
class Token{
    private int limit;
    private int period;
    private ArrayBlockingQueue<String> blockingQueue;
    private TimeUnit timeUnit;
    public Token(int limit, int period, TimeUnit timeUnit){
        this.limit = limit;
        this.timeUnit = timeUnit;
        this.period = period;
        this.blockingQueue = new ArrayBlockingQueue<>(limit);
        init();
        start();
    }
    public void init(){
        for(int i = 0;i < limit;i++){
            blockingQueue.offer("token");
        }
    }
    public boolean tryAcquire(){
        return blockingQueue.poll() != null;
    }
    public void addToken(){
        blockingQueue.add("1");
    }
    public void start(){
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(()->{
            addToken();
        },10,period,timeUnit);
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值