令牌桶算法:
在 Wikipedia 上,令牌桶算法是这么描述的:
- 每秒会有 r 个令牌放入桶中,或者说,每过 1/r 秒桶中增加一个令牌
- 桶中最多存放 b 个令牌,如果桶满了,新放入的令牌会被丢弃
- 当一个 n 字节的数据包到达时,消耗 n 个令牌,然后发送该数据包
- 如果桶中可用令牌小于 n,则该数据包将被缓存或丢弃
RateLimiter已经帮我们封装好了,我们使用就行
jar引入
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
简单代码(限流之缓存):
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class PoolTest {
private static RateLimiter rateLimiter;
@Test
public void pools(){
ExecutorService exxc = Executors.newFixedThreadPool(5);
RateLimiter rateLimiter =RateLimiter.create(1);
List<Runnable> tasks = new ArrayList<Runnable>();
for (int i = 0; i < 10; i++) {
tasks.add(new UserRequest(i));
}
for (Runnable runnable : tasks) {
System.out.println("等待时间:" + rateLimiter.acquire());
exxc.execute(runnable);
}
}
}
class UserRequest implements Runnable {
private int id;
public UserRequest(int id) {
this.id = id;
}
public void run() {
System.out.println(id);
}
}