example ejemplo java multithreading executorservice

java - ejemplo - Cómo verificar si todas las tareas que se ejecutan en ExecutorService están completadas



executorservice java ejemplo (1)

Tengo ConcurrentLinkedDeque que estoy usando para elementos push / pop sincrónicos, y tengo algunas tareas asíncronas que están sacando un elemento de la pila y si este elemento tiene vecinos, lo está empujando para apilar.

Código de ejemplo:

private ConcurrentLinkedDeque<Item> stack = new ConcurrentLinkedDeque<>(); private ExecutorService exec = Executors.newFixedThreadPool(5); while ((item = stack.pollFirst()) != null) { if (item == null) { } else { Runnable worker = new Solider(this, item); exec.execute(worker); } } class Solider{ public void run(){ if(item.hasNeighbors){ for(Item item:item.neighbors){ stack.push(item) } } } }

Me gustaría tener una declaración adicional en while loop que responda a la pregunta: "¿Alguna tarea en Executor está funcionando?"


No hay una manera limpia de verificar si se han ejecutado todos los Runnables si utiliza ExecutorService.execute(Runnable) . A menos que construyas un mecanismo para hacerlo en el mismo Runnable (que en mi opinión es descuidado).

En lugar:
Utilice ExecutorService.submit(Runnable) . Este método devolverá un Future<?> Que es un identificador del resultado de un ejecutable. El uso de futuros proporciona una forma limpia de comprobar los resultados.

Todo lo que tiene que hacer es mantener una lista de futuros que envíe, y luego puede iterar sobre toda la lista de futuros y:
A) esperar a que todos los futuros se realicen de forma bloqueada o
B) comprobar si todos los futuros se realizan de forma no bloqueante.

Aquí hay un ejemplo de código:

List<Future<?>> futures = new ArrayList<Future<?>>(); ExecutorService exec = Executors.newFixedThreadPool(5); // Instead of using exec.execute() use exec.submit() // because it returns a monitorable future while((item = stack.pollFirst()) != null){ Runnable worker = new Solider(this, item); Future<?> f = exec.submit(worker); futures.add(f); } // A) Await all runnables to be done (blocking) for(Future<?> future : futures) future.get(); // get will block until the future is done // B) Check if all runnables are done (non-blocking) boolean allDone = true; for(Future<?> future : futures){ allDone &= future.isDone(); // check if future is done }