2016-12-15 4 views
2

Code:ExecutorService nicht töten Faden

//List all threads: 
Set<Thread> runningThreads = Thread.getAllStackTraces().keySet(); 
System.out.println(runningThreads.toString()); 

//Thread creation: 
ExecutorService executorService = Executors.newSingleThreadExecutor(); 
executorService.execute(this); 

//Thread termination: 
executorService.shutdownNow(); 

//List all threads: 
Set<Thread> runningThreads = Thread.getAllStackTraces().keySet(); 
System.out.println(runningThreads.toString()); 

ich die Liste erwarten würde, die genau die gleichen beiden Male sein werden ausgedruckt, aber was ich bekomme ist ein Druck aus dem Thread, der erstellt wurde in den Ergebnissen enthalten

Wie kann ich einen Thread vollständig zerstören, so dass er nirgendwo zu finden ist?

+0

Sie sollten auf den Abschluss des Herunterfahrens warten. Die Threads sind möglicherweise noch nicht beendet. – glee8e

Antwort

1

shutdownNow() Versuche, den laufenden Thread zu stoppen, aber als seine API-Dokumentation sagt:

Diese Methode ist nicht für die aktive Ausführung von Aufgaben zu beenden, nicht warten. Verwenden Sie dazu awaitTermination.

So kann der Thread noch ausgeführt werden, wenn der Code nach dem Aufruf an shutdownNow() zurückgibt. Beachten Sie außerdem, dass Sie sicherstellen müssen, dass die Task, die im Thread ausgeführt wird, tatsächlich beendet wird. shutdownNow() wird nicht den Thread töten, es wird nur versuchen, es zu unterbrechen.

Wie die Dokumentation sagt, rufen Sie executorService.awaitTermination(...) nach dem Aufruf shutdownNow() warten, bis der Thread gestoppt hat.

+0

Was ist, wenn es nie endet? Es scheint sogar, wenn ich 'awaitTermination' für Tage setze, wird es einfach hängen bleiben und niemals den Thread wirklich töten. – Hooli

+1

@Hooli: Sie zeigen niemals die Aufgabe, die Sie dem Executor vorlegen. Wenn es nicht als Reaktion auf eine Unterbrechung beendet wird (es wird die InterruptedException abgetastet und wird weitergeschleift oder auf E/A blockiert), wird es nicht beendet. –

+0

@NathanHughes: Wäre es eine gute Idee, meinen Thread von 'while (true) {...}' in 'while (! This.isInterrupted()) {...}' zu ändern? – Hooli