Themen verstehen
Konzept
Ein Thread ist der Ausführungs -Thread im Programm. Mit der Java Virtual Machine können Anwendungen mehrere Ausführungs -Threads gleichzeitig ausführen.
Fadenfunktionen
Hat einen Zustand, der den Zustand eines Threads darstellt. Gleichzeitig hat ein Thread im JVM nur einen Zustand;
·NEU
Threads, die noch nicht gestartet wurden (Threads, die seit Beginn des Programmlaufs nicht gestartet wurden)
・ Runnable
Ein Runnable -Thread, der im JVM ausgeführt wird, aber es wartet möglicherweise auf andere Ressourcen wie die CPU.
・ Blockiert
Blockieren von Faden, Warten auf ein Schloss, damit er weiter läuft
·WARTEN
Infinite Warten Sie (Ausführen wieder in einem Thread, der darauf angewiesen ist, dass er in diesen Zustand eintritt, um einen bestimmten Vorgang auszuführen)
・ Timed_waiting
Timed Warted (noch einmal in einem Thread laufen, der darauf angewiesen ist, diesen Zustand für einen bestimmten Vorgang innerhalb einer bestimmten Wartezeit einzugeben)
・ Beendet
Ausgegangener Thread
Priorität haben und die Ausführungsreihenfolge von Threads bestimmen;
Eine Ganzzahl zwischen 1 und 10, der Standardwert ist 5. Je höher der Wert ist, desto höher ist die Ausführungsschance und die Priorität nicht die Ausführungsreihenfolge des Threads.
Die Priorität des untergeordneten Threads entspricht standardmäßig dem des übergeordneten Threads.
Beachten Sie, dass der JVM nicht mehr alle Threads ausführt, wenn:
Die Runtime (Laufzeit) der Exit () wird aufgerufen und der Anruf der Methode ist vom Sicherheitsmanager zulässig.
Alle "Nicht-Dahemon-Threads" haben aufgehört zu laufen (unabhängig davon, ob sie normal oder ein Stopp aufhören);
Kann als Daemon (Daemon) gekennzeichnet werden
Der Kinderfaden des Daemon -Threads ist immer noch der Daemon -Thread;
Der Daemon-Thread ist auch der "Backend-Thread", der im Allgemeinen zur Ausführung von Hintergrundaufgaben verwendet wird, während der Benutzer-Thread im Allgemeinen Aufgaben auf Benutzerebene ausführt.
Methoden zum Beenden von Faden
1. Verwenden Sie das Ausgangsflag, um den Gewinde normal zu beenden, dh der Thread endet, nachdem die Laufmethode abgeschlossen ist.
Wenn die Run -Methode ausgeführt wird, wird der Thread beendet. Aber manchmal endet die Run -Methode nie. Beispielsweise verwenden Sie Threads, um Client -Anforderungen in Serverprogrammen oder anderen Aufgaben anzuhören, die die Schleifenverarbeitung erfordern. In diesem Fall werden diese Aufgaben normalerweise in einer Schleife platziert, z. B. während der Schleife. Wenn Sie möchten, dass die Schleife für immer läuft, können Sie verwenden, während (true) {...} damit umgehen kann. Wenn Sie jedoch unter einer bestimmten Bedingung den Aufenthalt des Schleifens durchführen möchten, besteht die am stärksten direkte Möglichkeit darin, ein boolesches Flag einzustellen und zu steuern, ob die While -Schleife dieses Flag auf True oder False einstellen. Hier ist ein Beispiel für die Beendigung eines Fadens mit dem Ausgangsflag.
Flagexitthread.java
Paket com.rainmonth;/*** Erstellt von Randyzhang am 2017/3/23.
Democlient.java
Paket com.rainmonth;/*** Erstellt von Randyzhang am 2017/3/23. Flagexitthread (flagexitthread.class.getSimPename ()); flagexitthread.start (); try {thread.sleep (1000); flagexitthread.isexit = true; flagexitthread.join (); {e.printstacktrace ();}} private static void exitByInterrupt () {flagexitthread flagexitthread = new flagexitthread (flagexitthread.class.getSimPlename ()); {Thread.sleep(1500);System.out.println("flagExitThread interrupted...");flagExitThread.interrupt();Thread.sleep(1500);System.out.println("stop application...");}catch (InterruptedException e) {e.printStackTrace();}}}Ausgangsergebnis:
Drucken Sie ein paar ich renne nach dem Thread -Ausgang.
2. Verwenden Sie die Stop -Methode, um den Thread zwangs zu enden (diese Methode wird nicht empfohlen, da der Stopp mit Aussetzung und Lebenslauf gleich ist und möglicherweise auch unvorhersehbare Ergebnisse haben).
Zeigt die Methode "Stop () aufrufe. Die Beschreibung von Stop () im Quellcode lautet wie folgt:
/** Diese Methode ist von Natur aus unsicher. Stoppen Sie einen Thread mit* Thread.Stop veranlasst ihn, alle Monitore zu entsperren, die er gesperrt hat (als natürliche Folge des ungeprüften* <Code> ThreadDeath </code> Ausnahme, der den Stapel nach oben ausbreitet). Wenn* eines der zuvor durch diese Monitore geschützten Objekte in einem inkonsistenten Zustand war, werden die beschädigten Objekte für* andere Threads sichtbar, was möglicherweise zu willkürlicher Verhalten führt. Viele* Verwendungen von <Code> Stop </code> sollten durch Code ersetzt werden, die einfach* eine Variable ändern, um anzuzeigen, dass der Ziel -Thread* aufhören sollte, das Laufen zu lenken. Der Ziel -Thread sollte diese Variable* regelmäßig überprüfen und ordnungsgemäß aus seiner Run -Methode zurückkehren, wenn die Variable angibt, dass er nicht mehr ausgeführt werden soll. Wenn der* Ziel -Thread auf lange Zeiträume wartet (z.
Die allgemeine Bedeutung ist, dass die Unsicherheit der Methode inhärent ist. Anrufen von Stop (), um einen Thread zu beenden, wird alle von ihm gesperrten Monitore freigegeben (dies führt zu einer Ausnahme von ThreadDeath -Ausnahmen, die sich entlang des Stapels nach oben ausbreitet, um es zu prüfen, um geworfen zu werden). Wenn in Objekten, die zuvor von diesen freigegebenen Monitoren geschützt wurden, inkonsistenz ist und diese Objekte für andere Threads sichtbar sind, führt dies zu unerwarteten Konsequenzen. Was den Operationen stoppen sollte, werden durch Code ersetzt, der nur einen bestimmten Code ändern muss, um anzuzeigen, dass der Ziel -Thread das Laufen stoppen sollte (Methode 1 ist so). Wenn der Ziel -Thread lange Zeit auf eine bestimmte Bedingung (z. B. eine bestimmte Bedingungsvariable) wartet, sollten wir die Interrupt -Methode verwenden, um das Warten zu unterbrechen (dies ist die Methode der Methode 3).
3.. Verwenden Sie die Interrupt -Methode, um den Thread zu unterbrechen.
Interrupt buchstäblich bedeutet, zu enden, aber versuchen Sie nicht, den Thread zu beenden, indem Sie Interrupt aufrufen, da manchmal auch wenn Sie die Methode aufrufen, der Thread weiter ausführt. Sie können die obige ExitByFlag () herausstellen, die Methode exitByInterrupt () aktivieren und feststellen, dass die Interrupt () -Methode rechtzeitig aufgerufen wird, und ich renne ... (die Ergebnisse verschiedener Systeme und CPUs können unterschiedlich sein). Es ist ersichtlich, dass es nicht sicher ist, die Interrupt -Methode zu verwenden.
Zusammenfassen
Gemäß der obigen Analyse ist die am meisten empfohlene Methode die erste. Wir können Flags mithilfe gemeinsamer Variablen festlegen und Signale senden, um den Thread zu informieren, den er beenden muss. Natürlich müssen wir sicherstellen, dass die Operationen dieser gemeinsam genutzten Variablen synchron sind.
Das obige ist der gesamte Inhalt dieses Artikels über die Java -Terminierungs -Thread -Instanz und die Quellcode des Stop () -Methode. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!