Alternative zu Thread.stop() in Java 8?
Gibt es eine Möglichkeit zu zwingen, eine Thread
zu stoppen, unter Java 8, jetzt, dass Thread.stop
entfernt wurde? Dies beinhaltet zwingt ein thread wartet auf ein lock/synchronisiert/schlafen/warten/unendliche Schleife zu stoppen.
Dies ist gedacht als Teil eines watchdog für die Anwendung, die erkennen können, wenn es blockiert/eingefroren, zwingen, töten threads und dann speichern Sie den aktuellen Zustand zu vermeiden, Informationen verloren gehen - zwar gibt es eine hohe chance, diese Informationen, die korrupte aufgrund zu zwingen, einen thread zu beenden, ist es besser, eine Kopie der möglicherweise falschen Informationen, als es zu verlieren.
Versuchen, Sie zu speichern diese Informationen, ohne zu stoppen, eingesperrt threads ist unmöglich, da es zu speichern erfordert den Erwerb sperrt.
- Kann man das mit shutdown-hooks dump core in Reaktion auf ein SIGQUIT, anstatt zu versuchen, zu identifizieren, Fehlverhalten von threads innerhalb einer VM?
- Ich meine, die richtige Antwort ist: korrigieren Sie den code, die die Probleme verursacht, die macht, die Sie brauchen, um zu töten threads.
Thread.stop
entfernt wurde? Was für tolle Neuigkeiten, das war eines der schrecklichsten, vile Methoden überhaupt. In deinem Fall: Niemand kann Sie zwingen, sich zu sperren, der beim speichern der Daten, müssen einige refactoring-für Sie sicher-und es ist natürlich fehleranfällig, aber das ist ein inhärentes problem in dem, was Sie zu tun versuchen.- dies ist ein watchdog, wenn die Dinge schief gehen. Leider, Sie tun, und früher war es möglich, sich besser zu Verhalten (versuchen zu stoppen anmutig) werden als dies mit java 8. Offensichtlich nicht Deadlocks wäre besser, aber mit komplexen Gewinde-code mit bis zu Hunderten von user-plugins nicht entworfen, um gefädelt werden, es scheint unausweichlich.
- Sie "schief gehen" aufgrund von bugs und/oder ein schlechtes design, wenn das einzige Werkzeug, das Sie verwenden können, um das Problem zu beheben ist eine, die Sie sollten nicht verwendet haben und nicht mehr können. Zehntausende (konservativ) von anderen Stücken von software haben dieses problem nicht, und es ist unwahrscheinlich, du machst nichts besonders einzigartig (einige von uns).
- Diese Frage enthält eine Fehlinformation: 1.
Thread.stop()
wurde nicht entfernt; 2. es ist veraltet und für lange Zeit keine änderung in Java 8 in dieser Hinsicht; 3. es wurde benutzt, alle zusammen dennoch, wenn auch weniger oft. docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#stop-- - Das einzige, was passiert ist, ist, dass
Thread.stop(Throwable)
deaktiviert wurde (nicht entfernt!) so ist es nun wirftUnsupportedOperationException
und nicht versuchen zu stoppen, einen thread. - Danke für die Aufklärung - wusste nicht, siehe dein Kommentar bis jetzt, aber ich habe markiert Holger ' s Antwort unter Angabe der gleichen Sache als richtig. Habe ich falsch verstanden, die docs nach meinem code verwenden .stop(Throwable) brach, und dachte nach .stop() entfernt worden war, aber auch nicht wirklich überprüfen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wirklich brauchen, um zu stoppen
Thread
auf die harte Art und Weise können Sie prüfen, dass die Methode- Thread.stop()
(ohne Angabe einer beliebigenThrowable
) arbeitet immer noch mit Java 8. Es generiert einenThreadDeath
auf den beendeten thread, die behandelt werden kann wie jede andereError
trotz seiner ungewöhnlichen Namen. Der einzige Unterschied ist, dass kein stack-trace wird gedruckt, wennThreadDeath
ist nicht gefangen.Aber Vorsicht, dass diese Methode veraltet ist, für die meisten den gleichen Gründen als die anderen
stop
Methode. Könnte es sich unspported in einer der nächsten Versionen von Java. Es ist also noch Zeit zum nachdenken über einen plan B...UnsupporteOperationException
überhaupt.Lesen Sie diesen Artikel, erklären Sie es:
"Warum Sind Thread.stop, Thread.suspend, Thread.Lebenslauf und Laufzeit.runFinalizersOnExit Veraltet?"
http://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
Joshua Bloch: "Effective Java (2nd Edition)", Punkt 66: Synchronisieren Sie den Zugriff auf shared mutable data
Joshua Bloch erklärt, wie ein thread auf und sagt:
Dass bei Verwendung dieser Methode sollten Sie Griff auch die Synchronisation der boolean-Feld. Ich will nicht zu kopieren, zu viel Zeug von Joshua Blochs Buch, aber Sie finden dort alles, und in die offizielle Oracle Java-Dokumentation erwähnt.
interrupt
.Dem rechten Weg zu halten, ein thread ist zu nennen
interrupt
auf Sie.Thread.stop()
obwohl. Mitinterrupt
übernimmt die Arbeit getan, in dem thread ist gut erzogen und unterbrochen werden. Das ist nicht der Fall mit etwas so einfaches wie blockiert einInputStream
, und damit ist wahrscheinlich nicht ausreichend für einen watchdog überwacht.Thread#stop
ist weit entfernt von einer kill-Auftrag... eine einfachecatch (Throwable t) {}
hat Glück und wird nicht es.