Per favore aiutatemi a trovare il motivo per Perdita di filo nel codice qui sotto. Lo TestThread
non ottiene i dati inutili raccolti anche dopo che run() è stato completato (verificato dall'istruzione di stampa consolata) e il metodo principale è stato chiuso (verificato dall'istruzione print e dallo strumento profiler).Perché UserThread in esecuzione con ScheduleExecutorService non recupera dati inutili
Il numero TestThread
, tuttavia, viene raccolto automaticamente se è impostato come thread daemon, ad esempio t.setDaemon(true)
. Il codice seguente è solo un esempio di codice che illustra il problema nella mia applicazione. Sto cercando di utilizzare alcune classi di pianificazione preesistenti (progettate da qualcun altro che utilizza ScheduledExecutorService
). Ho notato che quando continuo a programmare più Runnable
s con la classe, i thread creati non ottengono mai la garbage collection.
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");
}
}
Buone informazioni John. Un pizzico. 'shutdown()' non chiude tutti i thread nel pool di thread fino a quando tutti i lavori non hanno già terminato l'esecuzione. – Gray
@Gray Buon punto –
Grazie ragazzi. Anche se inizialmente ho scelto questa come risposta accettata, in seguito ho scelto Chose Gray perché questa risposta non è auto-esplicativa senza quella di Gray. Questa risposta, tuttavia, mi ha dato la spiegazione completa necessaria per modificare il codice con fiducia :) e funziona! – Kes115