Eng*_*uad 7 java concurrency multithreading executorservice
如何控制/限制提交给的任务ExecutorService?我有SMSTask发送SMS消息,我需要控制执行程序,以便它只能发送最多N条消息/秒.
Pet*_*rey 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);
Run Code Online (Sandbox Code Playgroud)
将任务添加到队列中,它们将以每秒10个的速率处理.
尝试RateLimiter番石榴。您必须在池中运行的所有任务之间共享一个实例:
final RateLimiter rateLimiter = RateLimiter.create(N)
//and in your task:
rateLimiter.tryAcquire();
sendSms();
Run Code Online (Sandbox Code Playgroud)
tryAcquire();将精确地阻塞一定的时间以保持N频率。
| 归档时间: |
|
| 查看次数: |
3642 次 |
| 最近记录: |