Frage

Das Zerstören von Fäden ist in Java veraltet (und wird nicht nach Javadoc implementiert), und es ist nur ein Vorschlag, der auf dem Thread erwartet wird, dass sie aufhören, dies jedoch möglicherweise nicht tun. (Keine Möglichkeit, einen Faden im J zu töten, um zu tötenVM ist ein beunruhigendes Design, aber meine Frage ist nicht mit Design verbunden.)

Wie entladen Java -Anwendungsserver Anwendungen? Können sie irgendwie die Fäden einer Anwendung zerstören? Wenn ja, wie? Wenn nein, dann könnte ein einzelner Thread einer bereitgestellten App mit einem unendlichen Schleifen einen gesamten App-Server ohne Eingreifen von Möglichkeiten senken?

Tut mir leid, dass ich keine Testfälle dafür schreibe, aber ich würde gerne wissen, was dort wirklich los ist.

War es hilfreich?

Lösung

Sie dürfen keinen eigenen Thread in einem EJB -Server erstellen.

Es ist nicht so ungewöhnlich, Threads in einem Webcontainer (wie z. B. Tomcat) zu hervorbringen, obwohl Sie wirklich sorgfältig darüber nachdenken sollten - und sicherstellen sollten, dass Sie den Lebenszyklus dieser Threads verwalten.

Andere Tipps

Keine Möglichkeit zu bieten, einen Faden im J zu tötenVM ist ein beunruhigendes Design, aber meine Frage ist kein Design.

Da Ihre eigentliche Frage beantwortet wurde, werde ich mich mit dem oben angegebenen Satz befassen.

Die Geschichte ist, dass die Java -Designer ursprünglich tat Versuchen Sie, das Problem des Tötens und Suspendierens zu befassen, aber sie stießen auf ein grundlegendes Problem, das sie im Kontext der Java -Sprache nicht lösen konnten.

Das Problem ist, dass Sie einfach keine sicheren Fäden abtöten können, die gemeinsam genutzte Daten auf nichtatomarer Weise mutieren können oder die mit einem Warte-/Benachrichtigungsmechanismus mit anderen synchronisieren können. Wenn Sie in diesem Zusammenhang Thread -Töten implementieren, erhalten Sie teilweise Aktualisierungen von Datenstrukturen und andere Threads, die auf Benachrichtigungen warten, die niemals eintreffen. Mit anderen Worten, das Töten eines Threads kann den Rest der Anwendung in einem unsicheren und gebrochenen Zustand lassen.

Andere Sprachen / Bibliotheken (z. B. C, C ++, C#), mit denen Sie Threads abtöten können, leiden unter den oben beschriebenen Problemen, auch wenn die relevanten Spezifikationen / Lehrbücher dies nicht klar machen. Es ist zwar möglich, Themen zu töten, aber Sie müssen bei der Gestaltung und Implementierung der gesamten Anwendung sehr vorsichtig sein, um dies sicher zu tun. Im Allgemeinen ist es zu schwer, richtig zu werden.

Also (hypothetisch), was würde es brauchen, um das Töten von Faden in Java sicher zu machen? Hier sind ein paar Ideen:

  • Wenn Ihre JVM -Isolate implementiert sind, können Sie die Berechnung starten, die Sie möglicherweise in einem Kind -Isolat töten möchten. Das Problem ist, dass ein ordnungsgemäß implementiertes Isolat nur mit anderen Isolaten durch Botschaftübergang kommunizieren kann und im Allgemeinen viel teurer zu bedienen wäre.

  • Das Problem des gemeinsamen Veränderungszustands könnte durch vollständiges Verbot von Mutationen oder durch Hinzufügen von Transaktionen zum Java -Ausführungsmodell angegangen werden. Beide würden Java grundlegend verändern.

  • Das Problem der Wartezeit/Benachrichtigung könnte angegangen werden, indem es durch einen Rendezvous- oder Nachrichtenübergangsmechanismus ersetzt wird, mit dem der "andere" Thread informiert werden konnte, dass der Thread, mit dem er interagierte, verschwunden ist. Der "andere" Thread müsste noch codiert werden, um sich von diesem zu erholen.

BEARBEITEN - als Reaktion auf Kommandionen.

Mutex Deadlock war kein Problem für thread.destroy() Da es so konzipiert war, dass es alle Mutexes freigeben (Break), gehörte der Zerstörung des Fadens. Das Problem war, dass es keine Garantien gab, dass die Datenstruktur, die vom Mutex geschützt war, in einem gesunden Zustand sein würde, nachdem das Schloss gebrochen wurde.

Wenn ich die Geschichte dieses Themas richtig verstehe, Thread.suspend(), Thread.delete() usw wirklich Probleme in der realen Welt -Java 1.0 -Anwendungen verursachen. Und diese Probleme waren so schwerwiegend und für Anwendungsschreiber so schwer, dass die JVM -Designer entschieden haben, dass der beste Kurs darin bestand, die Methoden zu zerlegen. Dies wäre keine einfache Entscheidung gewesen.

Wenn Sie nun mutig sind, können Sie diese Methoden tatsächlich anwenden. Und sie können in einigen Fällen tatsächlich sicher sein. Der Aufbau einer Anwendung mit veralteten Methoden ist jedoch keine solide Software -Ingenieurpraxis.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top