如何控制/限制提交给ExecutorService
的任务?我有SMSTask
发送短信,我需要控制执行者,这样它每秒最多只能发送N条消息。
答案 0 :(得分:15)
假设您为每个任务创建一条SMS消息,您可以使用ScheduleExecutorService。
final Queue<Task> tasks = new ConcurrentLinkedQueue<Task>();
int ratePerSecond = 10;
final ExecutorService es = Executors.newCachedThreadPool();
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor();
ses.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
final Task task = tasks.poll();
if (task == null) return;
es.submit(new Runnable() {
@Override
public void run() {
process(task);
}
});
}
}, 0, 1000/ratePerSecond, TimeUnit.MILLISECONDS);
将任务添加到队列中,它们将以每秒10次的速度处理。
答案 1 :(得分:4)
从番石榴尝试RateLimiter
。您必须在池中运行的所有任务之间共享一个实例:
final RateLimiter rateLimiter = RateLimiter.create(N)
//and in your task:
rateLimiter.tryAcquire();
sendSms();
tryAcquire();
会严格限制保留N
频率的时间。