Estoy en el proceso de escribir un código donde cada vez que se encuentra una carpeta se supone que debe iniciar un nuevo hilo. El código se ve como, p
ublic void diff(File x,File y){ ThreadPoolExecutor executor=new ThreadPoolExecutor(10,30,2000,unit,BlockingQueue<Runnable> queue) if(x.isDirecotry && y.isDirectory){ Runnable thread=new DThread(x,y); Future<?> result=executor.submit(thread); if(result.isDone()){ LOGGER.debug(thread.toString()+"has completed"); }Estoy usando ThreadPoolExecutor para este propósito. Si cierro el ThreadPoolExecutor, entonces no tomará ningún subproceso nuevo. Pero existe la posibilidad de que nuevos hilos comiencen después de comenzar. Si no cierro ThreadPoolExecutor, todos los subprocesos se ejecutan, pero al final, la JVM no finaliza. Por favor, ayuda, ¿cómo puedo cerrar el grupo de subprocesos solo cuando se ejecutan todos los subprocesos para que la JVM finalice? También sugiera si hay una mejor manera de implementar el grupo de subprocesos. Quiero usar el grupo de subprocesos para poder usar subprocesos del grupo en lugar de crear un nuevo subproceso cada vez.
Las cosas que está enviando no deben ser subprocesos (subtipos de subprocesos). Deben ser tareas simples: implementaciones de Runnable o Callable .
La forma de apagar el ejecutor es llamar a shutdown() o shutdownNow() en él. El resumen de javadoc dice:
void shutdown(): inicia un apagado ordenado en el que se ejecutan las tareas enviadas anteriormente, pero no se aceptarán tareas nuevas.
List<Runnable> shutdownNow(): intenta detener todas las tareas que se están ejecutando activamente, detiene el procesamiento de las tareas en espera y devuelve una lista de las tareas que estaban esperando su ejecución.
Este último intenta detener las tareas interrumpiéndolas. Sin embargo, si el código de tarea no busca interrupciones, se ejecutará hasta completarse. (También deja de aceptar nuevas tareas).
Parece que shutdown() hace lo que quieres hacer.
El problema radica en el hecho de dónde debo colocar el método de apagado.
Lo llamas cuando quieres empezar a cerrar.
Porque existe la posibilidad de que surjan nuevos subprocesos después de que se llame al apagado.
Deja de llamarlos hilos. son tareas .
Cualquier tarea que se envíe después de que se haya llamado a shutdown() se rechazará.
Mi pregunta es cómo puedo verificar si todas las tareas han terminado de ejecutarse y solo luego llamar al apagado. Si llamo con el inicio de cada tarea , no permitirá nuevas tareas más adelante.
El momento correcto para llamar a shutdown() es cuando su aplicación ha terminado de enviar tareas al ejecutor.
Tal vez su problema conceptual sea el alcance del servicio ejecutor. Su código de ejemplo parece mostrar que cada llamada a diff está creando un nuevo objeto de servicio. Eso significa que tendría muchos grupos de subprocesos independientes... y no reutilizaría los subprocesos. Lo que realmente debe hacer es crear un grupo de subprocesos "global" y tener varias llamadas para diff las tareas de envío al mismo grupo.