看一下guavas
RateLimiter:
限速器。从概念上讲,速率限制器以可配置的速率分配许可证。如有必要,每个Acquisition()会阻塞,直到获得许可为止,然后再获取许可。一旦获得,便无需发放许可证。速率限制器通常用于限制访问某些物理或逻辑资源的速率。这与信号量相反,信号量限制并发访问的数量而不是速率(请注意,并发性和速率密切相关,例如,请参阅利特尔定律)。
它的线程安全,但仍然
@Beta。仍然值得尝试。
您必须
Executor针对速率限制器包装对的每个调用。对于更干净的解决方案,您可以为
ExecutorService。
从javadoc:
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); } }


