Ich habe eine Klasse erstellt, indem ich eine ausführbare Schnittstelle implementiert habe, und dann viele Threads (fast 10) in einer anderen Klasse meines Projekts erstellt.
Wie kann ich einige dieser Threads stoppen?Wie stoppe ich einen Thread, der durch die Implementierung der Runnable-Schnittstelle erstellt wurde?
Antwort
Die einfachste Weg ist, um interrupt()
es, die Thread.currentThread().isInterrupted()
verursachen true
zurückzukehren, und auch eine InterruptedException
unter bestimmten Umständen, in denen das Thema werfen kann warten, beispielsweise Thread.sleep()
, otherThread.join()
, object.wait()
usw.
Innerhalb der run()
Methode, die Sie c benötigen würden atch diese Ausnahme und/oder regelmäßig den Thread.currentThread().isInterrupted()
Wert überprüfen und etwas tun (zum Beispiel ausbrechen).
Hinweis: Obwohl Thread.interrupted()
die gleiche wie isInterrupted()
scheint, es hat eine unangenehme Nebenwirkung: Aufruf interrupted()
löscht die interrupted
Flagge, während isInterrupted()
Aufruf nicht der Fall ist.
Andere nicht unterbrechende Methoden beinhalten die Verwendung von "stop" (volatile
) Flags, die der laufende Thread überwacht.
Das Stoppen (Töten) eines Threads in der Mitte wird nicht empfohlen. Die API ist eigentlich veraltet.
Sie können jedoch weitere Details einschließlich Abhilfen hier: How do you kill a thread in Java?
Stoppen der Thread in der Mitte ist keine gute Übung. Ein geeigneterer Weg besteht darin, den Thread programmgesteuert zurückzugeben. Lassen Sie das Runnable-Objekt eine gemeinsame Variable in der run()
-Methode verwenden. Wann immer Sie möchten, dass der Thread beendet wird, verwenden Sie diese Variable als Flag.
EDIT: Beispielcode
class MyThread implements Runnable{
private Boolean stop = false;
public void run(){
while(!stop){
//some business logic
}
}
public Boolean getStop() {
return stop;
}
public void setStop(Boolean stop) {
this.stop = stop;
}
}
public class TestStop {
public static void main(String[] args){
MyThread myThread = new MyThread();
Thread th = new Thread(myThread);
th.start();
//Some logic goes there to decide whether to
//stop the thread or not.
//This will compell the thread to stop
myThread.setStop(true);
}
}
In meiner Klasse habe ich eine Methode geschrieben, die Flag auf false setzt. Aber ich kann nicht auf diese Methode von der anderen Klasse zugreifen, wo ich den Thread stoppen muss. – svkvvenky
Ist diese _other class_ diejenige, die den Thread startet? – Santosh
ja, du hast recht .... – svkvvenky
Wie ein Faden durch die Implementierung runnable Schnittstelle erstellt stoppen?
Es gibt viele Möglichkeiten, wie Sie einen Thread stoppen können, aber alle von ihnen spezifischen Code nehmen, dies zu tun. Ein typischer Weg, um einen Thread zu stoppen, ist ein volatile boolean shutdown
Feld zu haben, die die Kontrollen Faden so oft alle:
// set this to true to stop the thread
volatile boolean shutdown = false;
...
public void run() {
while (!shutdown) {
// continue processing
}
}
Sie den Faden auch unterbrechen können, die sleep()
, wait()
verursacht, und einige andere Methoden InterruptedException
zu werfen. Sie sollten auch für den Thread Interrupt-Flag-Test mit so etwas wie:
public void run() {
while (!Thread.currentThread().isInterrupted()) {
// continue processing
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// good practice
Thread.currentThread().interrupt();
return;
}
}
}
Beachten Sie, dass das ein Gewinde mit interrupt()
Unterbrechung wird nicht notwendigerweise dazu führen, dass sofort eine Ausnahme zu werfen.Nur wenn Sie sich in einer Methode befinden, die unterbrechbar ist, wird InterruptedException
ausgelöst.
Wenn Sie eine shutdown()
Methode Ihrer Klasse hinzufügen möchten, die Runnable
implementiert, sollten Sie Ihre eigene Klasse wie definieren.
public class MyRunnable implements Runnable {
private volatile boolean shutdown;
public void run() {
while (!shutdown) {
...
}
}
public void shutdown() {
shutdown = true;
}
}
In meiner Klasse habe ich eine Methode geschrieben haben, die Flagge (Abschaltung in Ihrem Beispiel) setzt ich bin auf true.But nicht auf dieses Verfahren von der anderen Klasse zuzugreifen, wo ich den Thread beenden müssen. – svkvvenky
Ja, Sie müssen es irgendwie aussetzen. Ich mache normalerweise so etwas wie 'public class MyClass implementiert Runnable {volatile boolean shutdown; public void run() {if (! shutdown) {...}}} '. Sie könnten eine 'shutdown()' Methode hinzufügen, die das shutdown Flag setzt. Dann würden Sie tun 'new Thread (new MyClass()) beginnen (.),' Um es auszuführen. – Gray
Thread.currentThread() unterbrochen wird() ist hervorragend arbeiten. aber dieser Code ist nur den Timer pausieren.
Dieser Code wird gestoppt und der Thread-Timer zurückgesetzt. h1 ist der Name des Bearbeiters. Dieser Code ist in Ihrem Button-Klick-Listener hinzugefügt. w_h = Minuten w_m = milli s i = Zähler
i=0;
w_h = 0;
w_m = 0;
textView.setText(String.format("%02d", w_h) + ":" + String.format("%02d", w_m));
hl.removeCallbacksAndMessages(null);
Thread.currentThread().isInterrupted();
}
});
}`
- 1. Wie wird Sleep() oder wait() ein Thread, der durch die Implementierung der Runnable-Schnittstelle erstellt wurde?
- 2. Wie stoppe ich einen Java-Thread?
- 3. Wie stoppe ich einen Thread von einem anderen Thread
- 4. Wie bekomme ich die Winapi-ID eines Threads, der mit der Standardbibliothek erstellt wurde?
- 5. Wie erstellt man einen Server, der für jeden Client einen neuen Thread erstellt?
- 6. Wie stoppe ich eine Windows-Dienstanwendung von einem Thread?
- 7. Wie stoppe ich den Code, nachdem die sleep() -Methode sofort ausgeführt wurde
- 8. Wie stoppe ich einen automatischen AJAX-Anruf?
- 9. Zugriff auf einen Socket, der an Thread übergeben wurde
- 10. Wie greife ich auf einen Syntaxbaum zu, der mit XML :: Parser erstellt wurde?
- 11. Wie stoppe ich requestAnimationFrame
- 12. Wie stoppe ich QElapsedTimer?
- 13. Wie säubere ich einen Thread, nachdem seine Ausführungsmethode beendet wurde?
- 14. Uninitialized Wert wurde durch eine Heapzuordnung erstellt
- 15. Wie behebe ich einen Punkt auf der Oberfläche eines 3D-Modells, das durch Textur-Mapping in OpenGL erstellt wurde?
- 16. Wie positioniere ich einen Farbwähler, der durch HTML5s Farbeingabe geöffnet wurde? Ich
- 17. Wie bekomme ich die Rolle eines QPushButton, der von einer QDialogButtonBox erstellt wurde?
- 18. Lösche einen geheimen Schlüssel, der als anonym erstellt wurde
- 19. Fehler Die Anwendungsdomäne, in der der Thread ausgeführt wurde, wurde entladen.
- 20. Wie erstelle ich einen NSThread, die nicht der Haupt-Thread ist ohne einen Wähler sofort
- 21. Wie kann ich eine Variable aus einer ID machen, die erstellt wird, nachdem der Artikel mit der ID erstellt wurde?
- 22. Wie man TCPClient durch Implementierung der Schnittstelle Mock
- 23. Verhindern, dass der tcl-Thread durch die Hauptereignisschleife blockiert wird
- 24. Warum stoppt der Thread nicht?
- 25. Wie zeige ich den REST JSON an, der von der NEST API erstellt wurde?
- 26. Wie gebe ich eine Funktor-Instanz an einen Datentyp, der für allgemeine Rekursionssysteme erstellt wurde?
- 27. Wie priorisiere ich einen Job, der mit dem Juwel delayed_jobs erstellt wurde?
- 28. Wie bekomme ich einen PySpark DataFrame, der mit HiveContext in Spark 1.5.2 erstellt wurde?
- 29. Taschenlampe: die Implementierung der Einbettungsschicht
- 30. Wie stoppe ich Fortschrittsbalken Jquery
Versuche abzubrechen, die Ausführung abzubrechen, aber es ist keine Garantie. – Rohit