2011-05-02 13 views
13

Estoy usando el pool de subprocesos en caché ExecutorService para ejecutar algunas tareas de fondo asincrónicas. He proporcionado mi ThreadFactory que entrega hilos al ExecutorService (siempre que los necesite). Mi comprensión del grupo de subprocesos almacenados en caché es que una vez que el subproceso está inactivo durante 60 segundos, el servicio Executor lo interrumpe.Java ExecutorService callback on thread terminte

Quiero realizar una limpieza de estado cuando mi thread está por terminar. ¿Cuál es la mejor manera de lograr esto? El ExecutorService no proporciona fácilmente ganchos en el ciclo de vida del hilo.

No quiero cerrar mi ExecutorService - útil para ejecutar tareas como y cuando vienen.

ExecutorService executor = Executors.newCachedThreadPool(new MyThreadFactory()); 

// Do some work 
executor.submit(new MyCallable()); 

// Need a way for the ExecutorService to notify me when it is about to 
// terminate my thread - need to perform some cleanup 

Gracias,

Shreyas

+0

+1 por pregunta interesante. Me pregunto si un finalizador funcionaría. – Rom1

+0

@ Rom1, alguien había publicado una respuesta sugiriendo implementar 'finalizar'. Creo que es una lástima que lo borraron. Lo que debe tenerse en cuenta es que usar 'finalize' significa incurrir en algunos hits de rendimiento en GC y JVM. –

+0

Intenté usar el enfoque de finalización pero no funcionó. El método no fue llamado. –

Respuesta

14

En su código ThreadFactory, crear la instancia de Thread tal que try para hacer el trabajo de la Runnable que se crea para y luego finally hacer su limpieza trabajo. De esta manera:

public Thread newThread(final Runnable r) { 
    Thread t = new Thread() { 
     public void run() { 
      try { 
       r.run(); 
      } finally { 
       //do cleanup code 
      } 
     } 
    }; 
    return t; 
} 
+1

Otra opción es usar un grupo de subprocesos de tamaño fijo y nunca limpiar. La memoria liberada nunca pasa de nuevo al sistema operativo, por lo que puede agregar complejidad sin un beneficio. –

+2

pero si lo que necesita limpiar es una conexión de base de datos, no puede simplemente 'nunca limpiar'. – stu

Cuestiones relacionadas