繁体   English   中英

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

[英]Control ExecutorService to execute N tasks per second maximum

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

假设您为每个任务创建一条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个的速率处理。

尝试来自番石榴的RateLimiter 您必须在池中运行的所有任务之间共享一个实例:

final RateLimiter rateLimiter = RateLimiter.create(N)

//and in your task:

rateLimiter.tryAcquire();
sendSms();

tryAcquire(); 将精确地阻止N频率的时间量。

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM