理论:
令牌存储桶算法是一种限制下载带宽的方法。你应该阅读这篇文章 :它解释了这个算法的使用。
实现:
RateLimiter from Google Guava
Google Guava 22.0包括一个RateLimiter类,但它仍处于测试阶段。
从 API 文档:
例如,假设我们有一个要执行的任务列表,但我们不希望每秒提交超过 2 个:
final RateLimiter rateLimiter = RateLimiter.create(2.0); // rate is "2 permits per second"
void submitTasks(List<Runnable> tasks, Executor executor) {
for (Runnable task : tasks) {
rateLimiter.acquire(); // may wait
executor.execute(task);
}
}
作为另一个例子,假设我们生成一个数据流,并且我们希望将其限制为每秒5kb。这可以通过要求每个字节的许可证,并指定每秒5000个许可证的速率来实现:
final RateLimiter rateLimiter = RateLimiter.create(5000.0); // rate = 5000 permits per second
void submitPacket(byte[] packet) {
rateLimiter.acquire(packet.length);
networkService.send(packet);
}
TimedSemaphore from Apache Commons Lang v3
Apache Commons Lang v3包含一个TimedSemaphore类,可用于实现速率限制。