如何控制/限制提交给 a 的任务ExecutorService
?我有SMSTask
它发送 SMS 消息,我需要控制执行程序,以便它只能以每秒最多 N 条消息发送。
问问题
4198 次
2 回答
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 个的速率处理。
于 2012-11-08T14:27:10.297 回答
4
试试RateLimiter
番石榴。您必须在池中运行的所有任务之间共享一个实例:
final RateLimiter rateLimiter = RateLimiter.create(N)
//and in your task:
rateLimiter.tryAcquire();
sendSms();
tryAcquire();
将精确地阻塞一段时间以保持N
频率。
也可以看看:
于 2012-11-08T14:26:46.600 回答