Stoppen Sie den Thread und beginnen Sie erneut, in Blackberry IllegalThreadStateException zu geben

8

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:

%Vor%

Aber thread.start() wirft IllegalThreadStateException .

Was soll ich verwenden, um es zu lösen?

    
AnkitRox 24.11.2012, 05:48
quelle

2 Antworten

16

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:

%Vor%

Aus den API-Dokumenten

  

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.

    
Nate 24.11.2012 05:59
quelle
7

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:

%Vor%

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:

%Vor%

Beachten Sie, dass der Thread weiterhin ausgeführt wird, auch nachdem interrupt() aufgerufen wurde. Die produzierte Ausgabe ist:

%Vor%

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 .

    
Vit Khudenko 25.11.2012 14:47
quelle