Control ExecutorService每秒最多执行N个任务

时间:2012-11-08 14:21:40

标签: java multithreading concurrency executorservice

如何控制/限制提交给ExecutorService的任务?我有SMSTask发送短信,我需要控制执行者,这样它每秒最多只能发送N条消息。

2 个答案:

答案 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频率的时间。

另见: