Manchmal sind Fadenhänge nützlich. Beispielsweise kann ein separater Thread verwendet werden, um die Tageszeit anzuzeigen. Wenn der Benutzer die Uhr nicht verwenden möchte, wird der Thread suspendiert. In jedem Fall ist das Aussetzen des Threads sehr einfach, und sobald er suspendiert ist, ist es auch eine einfache Angelegenheit, den Thread neu zu starten.
Die Mechanismen zur Aussetzung, Beendigung und Wiederherstellung von Fäden unterscheiden sich in Java 2 und früheren Versionen. Obwohl Sie Java 2 verwenden, um Code zu schreiben, müssen Sie immer noch verstehen, wie diese Operationen in der frühen Java -Umgebung durchgeführt wurden. Sie müssen beispielsweise alten Code aktualisieren oder verwalten. Sie müssen auch verstehen, warum Java 2 solche Änderungen hat. Aus diesen Gründen beschreibt Folgendes die ursprüngliche Methode zur Ausführung der Thread -Steuerung, gefolgt von der Java 2 -Methode.
Pause, Wiederherstellung und Beendigung von Fäden in Java 1.1 oder früher
Vor der Java2-Version verwendet das Programm Thread Defined Suspend () und Resume (), um Threads zu pausieren und neu zu starten. Sie sind in Form von:
endgültige void suspend () endgültiger void Lebenslauf ()
Das folgende Verfahren beschreibt diese Methoden:
// Suspend () und Resume (). out .Println ("neuer Thread:" + T); i> 0; ":::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: ::::::::::::::::) new thread ("eins"); .Sep (1000); Schlaf (1000); Warten Sie, bis Threads {System.out.Println ("Warten auf Threads abgeschlossen sind"). println ("Hauptfache unterbrochen"); Ein Teil der Programmausgabe ist wie folgt:
Neuer Thread: Thread [Eins, 5, Haupt] Eins: 15New Thread: Thread [zwei, 5, Main] zwei: 15one: 14two: 14one: 13two: 13one: 12two: 11two: 11Suspending Thread Onetwo: 10two: 9two: 8two: 7tWO: 6Resuming Thread Oneuspending Thread Twoone: 10one: 9one: 8one: 7one: 6Resuming Thread Twowaiting für Fäden zu beenden .
Die Thread -Klasse definiert auch Stop (), um den Thread zu beenden. Seine Form ist wie folgt:
Hohlraum Stopp ()
Sobald der Thread beendet ist, kann er nicht durch Resume () wieder aufgenommen werden, um weiter zu laufen.
Fäden in Java aussetzen, wiederherstellen und beenden
Thread-definierte Suspend (), Resume () und Stop () scheinen perfekte und bequeme Möglichkeiten für die Verwaltung von Threads zu sein, und sie können nicht in neuen Java-Versionen von Programmen verwendet werden. Hier sind die Gründe. Die Suspend () -Methode der Thread -Klasse wird in Java2 nicht bevorzugt, da Suspend () manchmal schwerwiegende Systemfehler verursachen kann. Unter der Annahme, dass ein Thread für eine kritische Datenstruktur gesperrt ist, geben die gesperrten Gewinde die Kontrolle der Ressource nicht auf. Andere Themen, die auf diese Ressourcen warten, können abgestimmt werden.
Die Lebenslauf () -Methode ist ebenfalls nicht genehmigt. Es verursacht keine Probleme, kann aber ohne die methode suspend () nicht unabhängig verwendet werden. Die Stop () -Methode der Thread -Klasse ist auch in Java 2 abgelehnt. Dies liegt daran, dass diese Methode schwerwiegende Systemfehler verursachen kann. Stellen Sie sich vor, ein Thread schreibt eine präzise und wichtige Datenstruktur und vervollständigt nur einen Bruchteil davon. Wenn der Thread in diesem Moment endet, kann die Datenstruktur in einem Absturzzustand bleiben.
Da in Java 2, Suspend (), Resume () und Stop () Methoden nicht zur Steuerung von Threads verwendet werden können, denken Sie möglicherweise, dass es keine Möglichkeit gibt, Threads anzuhalten, wiederherzustellen und zu beenden. Eigentlich ist es nicht der Fall. Stattdessen muss der Thread so gestaltet werden, dass die Run () -Methode regelmäßig prüft, ob der Thread ausgesetzt werden sollte, wieder aufnehmen oder ihre eigene Ausführung beenden. Dies geschieht durch die Festlegung einer Flag -Variablen, die den Status des Threads anzeigt. Solange das Flag auf "Ausführen" eingestellt ist, muss die Run () -Methode weiterhin vom Thread ausgeführt werden. Wenn die Flagge "suspendieren" ist, muss der Thread durchgeführt werden. Wenn auf "Stopp" eingestellt ist, muss der Thread beendet werden.
Natürlich gibt es viele Möglichkeiten, einen solchen Code zu schreiben, aber das zentrale Thema sollte für alle Programme gleich sein.
Die folgenden Beispiele veranschaulichen, wie die von Objekte verwickelten Wait ()- und Benachrichtigung () -Methoden die Ausführung von Threads steuern. Dieses Beispiel ist dem zuvor erwähnten Programm sehr ähnlich. Keine der nicht genehmigten Methoden ist nützlich. Denken wir über die Ausführung des Programms nach.
Die NewTread -Klasse enthält die Instanzvariable Suspendflag, mit der die Ausführung eines Threads gesteuert wird. Es wird vom Konstruktor auf False initialisiert. Die Run () -Methode enthält einen Block, der die Synchronisationsdeklaration von Suspendflag überwacht. Wenn die Variable wahr ist, wird die Wait () -Methode aufgerufen, um den Thread auszusetzen. Die Methode mysuspend () setzt Suspendflag auf true. Die Methode Myresume () setzt Suspendflag auf false und ruft die melden () -Methode auf, um den Thread hervorzurufen. Schließlich wird die Main () -Methode so geändert, dass sie die Methoden von Mysuspend () und Myresume () aufrufen.
// Säure ein Thread für Java2 -Klassen implementiert {String -Name; out .Println ("neuer Thread:" + T); t i = 15; }}} catch (InterruptedException e) {System.out.println (Name + "Interrupted."); void myresume () {suspendflag = false; ; Thread eins "); ob2.mysuspend (); System.out.println (" Thread zwei "); Thread.Sleep (1000); Ob2.myresume (); System.out.println (" wieder aufnehmen Thread t wo ") ; T.Join (); }Die Ausgabe dieses Programms entspricht dem des vorherigen Programms. Später in diesem Buch sehen Sie weitere Beispiele für die Verwendung von Java 2 -Mechanismus zur Steuerung von Threads. Obwohl dieser Mechanismus nicht so "sauber" ist wie die alte Methode, ist dies der Weg, um sicherzustellen, dass zur Laufzeit keine Fehler auftreten. Es ist die Methode, die alle neuen Code annehmen müssen.