Wie man einen Thread unbedingt stoppt

8

Gelegentlich müssen wir einen Thread zwangsweise stoppen, bevor wir die gesamte JVM vollständig herunterfahren. Gewöhnlich wird Thread#stop als todsichere Methode zitiert, auch wenn es umhängt und veraltet ist, um einen Thread bedingungslos zu stoppen. Das ist jedoch nicht so: der ganze Rogue-Thread muss tun, um sich selbst zu betreiben, ist catch ThreadDeath oder eine Oberklasse:

%Vor%

Dies wird gedruckt

%Vor%

Gibt es noch etwas, das ich wirklich tun könnte, wirklich einen Thread stoppen, ohne die ganze JVM zu töten?

    
Marko Topolnik 22.06.2013, 14:07
quelle

2 Antworten

5

Nein. Es gibt keine einfache Möglichkeit, wirklich einen Thread zu stoppen.

Solch eine Methode, zerstören, war geplant, aber nicht implementiert :

  

Veraltet. Diese Methode wurde ursprünglich entwickelt, um diesen Thread ohne jegliche Bereinigung zu zerstören. Alle Monitore, die es hielt, wären verschlossen geblieben. Die Methode wurde jedoch nie implementiert. Wenn es implementiert werden würde, wäre es in vielerlei Hinsicht deadlock-anfällig (). Wenn der Zielthread eine Sperre enthielt, die eine kritische Systemressource beim Vernichten schützt, konnte kein Thread jemals wieder auf diese Ressource zugreifen. Wenn ein anderer Thread jemals versucht hat, diese Ressource zu sperren, würde sich ein Deadlock ergeben. Solche Deadlocks manifestieren sich typischerweise als "eingefrorene" Prozesse.

Threads sind dafür nicht gedacht. Sie bieten keine Sicherheit. Der andere Thread könnte genauso gut die JVM selbst beenden - oder andere problematische Threads erzeugen.

Weitere Informationen finden Sie unter Warum Thread.stop, Thread.suspend und Thread.resume sind veraltet. Sie können warum hier lesen.

    
Benjamin Gruenbaum 22.06.2013, 14:22
quelle
0

Es gibt keine Möglichkeit zu garantieren, dass dieser Thread in Java gestoppt werden kann. Der stärkste Weg ist Thread.stop, aber das ist ein Unfall, der darauf wartet, passiert zu sein. Die Alternativen bestehen darin, Thread.interrupt zu verwenden, und der Thread prüft ein Flag, aber beide setzen voraus, dass der Thread korrekt codiert ist und im Fall des Flags regelmäßig überprüft wird.

Ich persönlich würde sicherstellen, dass ich ThreadDeath nicht erwische. Stop ist ein schlechter Weg, um einen Thread zu stoppen, aber zumindest sollten Sie eine Benachrichtigung erhalten, solange Sie ThreadDeath nicht abfangen.

    
wobblycogs 22.06.2013 14:22
quelle

Tags und Links