8

如何控制/限制提交给 a 的任务ExecutorService?我有SMSTask它发送 SMS 消息,我需要控制执行程序,以便它只能以每秒最多 N 条消息发送。

4

2 回答 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 回答