Ich erhalte IllegalThreadStateException
Ausnahme, wenn folgender Code verwendet wird:
Ich habe diesen Thread bereits einmal gestartet (indem ich thread.start()
benutzt habe) und versuche erneut, ihn an einer anderen Stelle zu starten, verwende also folgenden Code:
Aber thread.start()
wirft IllegalThreadStateException
.
Was soll ich verwenden, um es zu lösen?
Thread
Objekte sollen nur einmal gestartet werden. Wenn Sie ein Thread
stoppen / unterbrechen müssen und es dann erneut starten möchten, sollten Sie eine neue Instanz erstellen und start()
darauf aufrufen:
IllegalThreadStateException - wenn der Thread bereits gestartet wurde.
Ich weiß, es ist nicht 100% ig klar, dass du start()
nicht mehr aufrufen kannst, auch wenn du vorher interrupt()
aufgerufen hast, aber so funktioniert es.
Wenn Sie sich die API-Dokumentation ansehen Für Standard-Java ist dieses Problem deutlicher.
Zusätzlich zu Nates Antwort.
AnkitRox sagt in seinem Kommentar:
Danke Nate. Ich habe auch deine Methode versucht. Aber das Problem trat zu dieser Zeit auf, es wurde ein neuer Thread für die neue Instanz gestartet und der vorherige Thread funktionierte ebenfalls.
Es sieht so aus, als wäre das Problem "Der Thread läuft noch, auch wenn ich Interrupt darauf anrufe" . Betrachten Sie dieses Beispiel (es ist hässlich, aber genug, um die Hauptidee zu zeigen):
%Vor% Beachten Sie, dass der Thread weiterhin ausgeführt wird, auch nachdem interrupt()
aufgerufen wurde. Die produzierte Ausgabe ist:
Tatsächlich hört das Programm niemals auf, es sei denn, es wird gewaltsam geschlossen. Also was dann macht das interrupt()
? Es setzt nur das unterbrochene Flag auf true
. Nachdem interrupt()
aufgerufen wurde, beginnt Thread.currentThread().isInterrupted()
mit false
. Und das ist alles.
Ein anderer Fall ist, wenn interrupt()
aufgerufen wird, während der Thread bei einem Aufruf einer der Methoden, die InterruptedException
auslösen, blockiert wird, dann gibt diese Methode zurück, indem sie InterruptedException
wirft. Und wenn der Code des Threads diese Ausnahme gerade "isst", wird der Thread trotzdem weiter ausgeführt. Betrachten Sie ein Beispiel:
Beachten Sie, dass der Thread weiterhin ausgeführt wird, auch nachdem interrupt()
aufgerufen wurde. Die produzierte Ausgabe ist:
Beachten Sie, diese Zeit interrupted = false
auch nachdem interrupt()
aufgerufen wurde. Dies liegt daran, dass, wenn InterruptedException
abgefangen wird, das unterbrochene Flag auf false
zurückgesetzt wird.
In Java ist das Stoppen eines Threads ein kooperativer -Mechanismus. Das bedeutet, dass es nicht ohne die Zusammenarbeit mit dem Thread selbst möglich ist. Hier ist die feste Version des obigen Beispiels:
%Vor% Der richtige Ansatz sollte also sein, das unterbrochene Flag regelmäßig zu überprüfen. Und wenn der unterbrochene Status erkannt wird, kehren Sie einfach so schnell wie möglich zurück. Eine andere gebräuchliche Option ist, Thread.interrupt()
überhaupt nicht zu verwenden, sondern einige benutzerdefinierte Boolesche statt .
Tags und Links java multithreading blackberry java-me