Capítulo 15. El pestillo de cuenta atrás: ¿amigo o enemigo?
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
Alexey Soshin
Imaginemos una situación en la que quisiéramos lanzar varias tareas simultáneas y esperar a que se completen antes de seguir adelante. La página ExecutorService facilita la primera parte:
ExecutorService pool = Executors.newFixedThreadPool(8);
Future<?> future = pool.submit(() -> {
// Your task here
});
Pero, ¿cómo esperamos a que se completen todas? CountDownLatch viene a nuestro rescate. Un CountDownLatch toma el número de invocaciones como argumento constructor. A continuación, cada tarea mantiene una referencia a él, llamando al método countDown cuando la tarea se completa:
int tasks = 16;
CountDownLatch latch = new CountDownLatch(tasks);
for (int i = 0; i < tasks; i++) {
Future<?> future = pool.submit(() -> {
try {
// Your task here
}
finally {
latch.countDown();
}
});
}
if (!latch.await(2, TimeUnit.SECONDS)) {
// Handle timeout
}
Este código de ejemplo lanzará 16 tareas y esperará a que terminen antes de seguir adelante. Sin embargo, hay que tener en cuenta algunos puntos importantes:
-
Asegúrate de liberar el pestillo en un bloque
finally. De lo contrario, si se produce una excepción, tu subproceso principal puede esperar eternamente. -
Utiliza el método
awaitque acepta un periodo ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access