<!--QPS-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
package com.example.demo.qps;
import com.google.common.util.concurrent.RateLimiter;
import java.util.concurrent.TimeUnit;
/**
* QPS
*
* @author
* @since 2024/12/27 11:12
*/
public class LimitCallService {
//每秒只发出5个令牌
static RateLimiter rateLimiter = RateLimiter.create(5.0);
public static void main(String[] args) throws Exception {
// for (int i = 0; i < 10; i++) {
// final int index = i;
// new Thread(() -> {
// //获取不到则阻塞
// rateLimiter.acquire();
// System.out.println("acquire" + index + ":" + System.currentTimeMillis());
// }).start();
// }
for (int i = 0; i < 10; i++) {
final int index = i;
new Thread(() -> {
try {
TimeUnit.MILLISECONDS.sleep(index * 100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
//获取不到就立即返回false,
// *注意:5个QPS表示1秒被切分成了5个200毫秒,如果同一时刻并发访问,只有一个线程能获取到令牌
// 也就是200毫秒之后才会发放下一个令牌
boolean b = rateLimiter.tryAcquire();
System.out.println("tryAcquire" + index + ":"+ b + System.currentTimeMillis());
}).start();
}
}
}
——参考Guava-RateLimiter详解 - 简书