Ayúdeme a encontrar el motivo de la fuga de subprocesos en el código siguiente. El TestThread
no obtiene basura recolectada incluso después de que se haya completado la ejecución() (verificada desde la sentencia de impresión con consolas) y el método principal ha salido (verificado desde la declaración de impresión y la herramienta de creación de perfiles).Por qué UserThread se ejecuta con ScheduleExecutorService no obtiene basura recolectada
Sin embargo, TestThread
obtiene basura recolectada si está configurada como Daemon Thread, es decir, t.setDaemon(true)
. El siguiente código es solo un código de muestra que ilustra el problema en mi aplicación. Intento utilizar alguna clase de planificación preexistente (que fue diseñada por otra persona usando ScheduledExecutorService
). Noté que cuando sigo programando múltiples Runnable
s con la clase, los hilos creados nunca se recogen basura.
public class ThreadTest {
static void runThreadWithExecutor() {
final String name = "TestThread";
ScheduledExecutorService ses = Executors.newSingleThreadScheduledExecutor(
new ThreadFactory() {
@Override
public Thread newThread(Runnable r) {
Thread t = new Thread(r, name);
t.setDaemon(false);
return t;
}
});
ses.schedule(new Runnable() {
@Override
public void run() {
System.out.println("entered " + name);
System.out.println("exiting " + name);
}},
2,
TimeUnit.SECONDS);
}
public static void main(String[] args) throws InterruptedException {
System.out.println("entered main");
runThreadWithExecutor();
Thread.sleep(5000);
System.out.println("exiting main");
}
}
Buena información John. Un ajuste. 'shutdown()' no finaliza todos los subprocesos en el grupo de subprocesos hasta que todos los trabajos ya se hayan enviado. – Gray
@Gray Buen punto –
Gracias chicos. Aunque inicialmente seleccioné esto como mi respuesta aceptada, más tarde escogí a Gray porque esta respuesta no se explica por sí misma sin la de Gray. Esta respuesta, sin embargo, me dio la explicación completa necesaria para modificar el código con confianza :) ¡y funciona! – Kes115