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();
}
}
运行这个例子,就看到被限流了.
网友评论