Tengo una cola de tareas en Java. Esta cola está en una tabla en el DB.Cómo administrar subprocesos M (1 por tarea) asegurando solo N subprocesos al mismo tiempo. Con N <M. En Java
I necesidad de:
- 1 hilo por tarea sólo
- No más de hilos N se ejecutan al mismo tiempo. Esto se debe a que los hilos tienen interacción DB y no quiero tener un grupo de conexiones DB abiertas.
creo que podría hacer algo como:
final Semaphore semaphore = new Semaphore(N);
while (isOnJob) {
List<JobTask> tasks = getJobTasks();
if (!tasks.isEmpty()) {
final CountDownLatch cdl = new CountDownLatch(tasks.size());
for (final JobTask task : tasks) {
Thread tr = new Thread(new Runnable() {
@Override
public void run() {
semaphore.acquire();
task.doWork();
semaphore.release();
cdl.countDown();
}
});
}
cdl.await();
}
}
sé que existe una clase ExecutorService, pero no estoy seguro si es que se puede utilizar para esto.
Entonces, ¿crees que esta es la mejor manera de hacerlo? ¿O podría aclararme cómo funciona ExecutorService para resolver esto?
solución final:
creo que la mejor solución es algo así como:
while (isOnJob) {
ExecutorService executor = Executors.newFixedThreadPool(N);
List<JobTask> tasks = getJobTasks();
if (!tasks.isEmpty()) {
for (final JobTask task : tasks) {
executor.submit(new Runnable() {
@Override
public void run() {
task.doWork();
}
});
}
}
executor.shutdown();
executor.awaitTermination(Long.MAX_VALUE, TimeUnit.HOURS);
}
Gracias mucho por los awnsers. Por cierto, estoy usando un grupo de conexiones, pero las consultas a la base de datos son muy pesadas y no quiero tener un número incontrolado de tareas al mismo tiempo.
Así que parece que tampoco necesito el semáforo, ¿verdad? – user2427
Sí, también puedes eliminarlo. –