In der Java-Multithread-Programmierung enthält der Typ java.lang.Thread eine Reihe von Methoden start(), stop(), stop(Throwable) und suspend(), destroy() und resume(). Mit diesen Methoden können wir praktische Vorgänge an Threads ausführen, von diesen Methoden bleibt jedoch nur die start()-Methode erhalten.
Die Gründe für den Verzicht auf diese Methoden werden ausführlich in einem Artikel von Sun erläutert: „Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?“
Wenn Sie einen Thread wirklich beenden müssen, können Sie die folgenden Methoden verwenden:
1. Lassen Sie die Ausführung der run()-Methode des Threads beenden und der Thread endet auf natürliche Weise. (Diese Methode ist die beste)
2. Beenden Sie den Thread, indem Sie Flag-Bits abfragen und freigeben, z. B. while(flag){}. Der Anfangswert von Flag wird auf true gesetzt. Wenn er beendet werden muss, wird der Wert von Flag auf false gesetzt. (Diese Methode ist auch nicht sehr gut, denn wenn die Methode while(flag){} blockiert, wird das Flag ungültig.)
privater flüchtiger boolescher Wert stop = false;
public voidterminate() {
stop = wahr;
}
public void run() {
while(stop) {
// ... einige Aussagen
}
}
}
Wenn der Thread aufgrund der Ausführung von Sleep () oder Wait () in den Status „Not Runnable“ (Nicht ausführbar) wechselt und es sich um Wait () handelt, funktioniert er nicht, wenn das Flag-Bit verwendet wird.
Öffentliches Warten auf endgültige Leere (lange Zeitüberschreitung)
löst eine InterruptedException aus. Diese Methode bewirkt, dass sich der aktuelle Thread (nennen Sie ihn T) in den Wartesatz des Objekts einfügt und dann alle Synchronisierungsanforderungen für dieses Objekt aufgibt. Das heißt, der aktuelle Thread wird in einen Wartezustand versetzt
Standardverwendung von wait()
synchronisiert(obj){
while(<Bedingung nicht erfüllt>){
obj.wait();
}
Verarbeitungsprozess, der Bedingungen erfüllt
}
Und wenn Sie es stoppen möchten, können Sie den dritten verwenden, d. h.
3. Verwenden Sie interrupt(), und das Programm löst eine InterruptedException-Ausnahme aus, wodurch der Ausführungsthread die run()-Methode verlässt.
Zum Beispiel:
öffentliche Klasse SomeThread {
public static void main(String[] args)
{
Thread thread=new Thread(new Runnable(){
public void run() {
while (!Thread.interrupted()) {
// Verarbeiten Sie die zu verarbeitende Arbeit
versuchen {
System.out.println("schlafen gehen");
Thread.sleep(1000);
} Catch (InterruptedException e) {
e.printStackTrace();
System.out.println("Ich werde unterbrochen!");
}
});
thread.start();
thread.interrupt();
}
}
geh schlafen
Ich werde unterbrochen!