How to control/limit the tasks that are submitted to a ExecutorService
? I have SMSTask
that sends SMS messages and I need to control the executor so that it can only send at maximum N messages/second.
There are a few different ways to delegate tasks for execution to an ExecutorService : execute(Runnable) submit(Runnable) submit(Callable)
The Java ExecutorService is a construct that allows you to pass a task to be executed by a thread asynchronously. The executor service creates and maintains a reusable pool of threads for executing submitted tasks.
When using an Executor, we can shut it down by calling the shutdown() or shutdownNow() methods. Although, it won't wait until all threads stop executing. Waiting for existing threads to complete their execution can be achieved by using the awaitTermination() method.
ExecutorService is a JDK API that simplifies running tasks in asynchronous mode. Generally speaking, ExecutorService automatically provides a pool of threads and an API for assigning tasks to it.
Assuming you are creating one SMS message per task you can use a 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);
Add tasks to the queue and they will be processed at a rate of 10 per second.
Try RateLimiter
from Guava. You must share one instance between all tasks running in the pool:
final RateLimiter rateLimiter = RateLimiter.create(N)
//and in your task:
rateLimiter.tryAcquire();
sendSms();
tryAcquire();
will block for the amount of time precisely to preserve N
frequency.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With