美文网首页
使用Guava实现限流器

使用Guava实现限流器

作者: zxbyh | 来源:发表于2023-05-09 16:26 被阅读0次

pom依赖

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>31.1-jre</version>
        </dependency>

直接上代码!

package cn.quick.base.obj;

import com.google.common.util.concurrent.RateLimiter;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class RateLimit {

    private static volatile int acquireCount = 0;
    /**
     * 每秒可以获得50个许可证
     */
    private RateLimiter rateLimiter = RateLimiter.create(50);

    private boolean tryAcquire() {
        // 等待1秒钟如果未能获取到许可证就返回false,否则返回true
        return rateLimiter.tryAcquire(1, 1000, TimeUnit.MILLISECONDS);
    }

    private void testDm(){

        ExecutorService executorService = Executors.newCachedThreadPool();
        for (int i = 0; i < 1000; i++) {
            executorService.execute(new Runnable() {
                @Override
                public void run() {
                    if (RateLimit.this.tryAcquire()) {
                        System.out.println("获取许可证,执行业务逻辑。");
                        synchronized (RateLimit.this) {
                            System.out.println(++acquireCount);
                        }
                        try {
                            Thread.sleep(20);
                        } catch (InterruptedException ex) {
                            //
                        }
                    } else {
                        System.err.println("未获取到许可证,请求可以丢弃。");
                    }
                }
            });
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        executorService.shutdown();

    }

    public static void main(String[] args) {
        RateLimit accessLimitService = new RateLimit();
        accessLimitService.testDm();
    }
}

运行这个例子,就看到被限流了.

相关文章

网友评论

      本文标题:使用Guava实现限流器

      本文链接:https://www.haomeiwen.com/subject/cmgrsdtx.html