Arrêter le fil et de nouveau commencer à donner IllegalThreadStateException dans blackberry
Je suis IllegalThreadStateException
exception lors de l'utilisation de code suivant:
J'ai déjà commencé ce fil une fois(à l'aide de thread.start()
) et encore une fois, essayer de la faire démarrer à un autre endroit, donc utilisé le code suivant:
thread.interrupt();
thread.start();
Mais thread.start()
est en train de jeter IllegalThreadStateException
.
Que dois-je utiliser pour le résoudre?
juste ajouté
java
tag, puisqu'il est commun à toute java
.
OriginalL'auteur AnkitRox | 2012-11-24
Vous devez vous connecter pour publier un commentaire.
Thread
objets sont uniquement destinées à être lancé une fois. Si vous devez arrêter ou interrompre unThread
, et que vous souhaitez démarrer à nouveau, vous devez créer une nouvelle instance, et en appelstart()
:À partir de l'API docs
Je sais que c'est pas 100% clair que vous ne pouvez pas appeler
start()
de nouveau, même si vous avez déjà appeléinterrupt()
, mais c'est la façon dont il fonctionne.Si vous regardez la Les docs de l'API standard de Java, cette question est plus claire.
l'API docs ne pas montrer qu'
interrupt()
lève toutes les exceptions. Cependant, j'imagine que vous êtes d'appelinterrupt()
avant même la 1ère fois que vous exécutez ce code. Vous serait vraiment seulement besoin d'interrompre le thread si ça a été commencé à la fois. Ainsi, les 2e, 3e, etc. fois que vous voulez l'appelerstart()
, vous pourriez l'appelerinterrupt()
droit à l'avance. Vous pouvez le testerthread.isAlive()
avant d'appelerthread.interrupt()
. Si cela ne fonctionne pas, vous avez besoin de montrer un peu de code (par exemple, la façon dont vous créez l'objet Thread).J'ai une classe comme
AsyncUploadQuestionsAndLeads
qui est prolongée parThread
. Initialisation de l'objet Thread à l'aide de:AsyncUploadQuestionsAndLeads uploadThread = new AsyncUploadQuestionsAndLeads(event);
Et le démarrage du thread à partir d'un autre lieu:uploadThread.start();
Après un certain temps, je suis en utilisant le code:uploadThread.interrupt(); uploadThread.start();
C'est mon code de procédure que j'ai suivie. Encore une Question est - est-ce thread s'arrête de lui-même, quand il la complète exécution du bloc?Merci de lire ma réponse. Vous ne pouvez pas appeler
interrupt()
, et ensuite appelerstart()
juste après sur le même exemple. Si vous allez appelerstart()
un deuxième temps, vous devez créer une nouvelle instance avecuploadThread = new AsyncUploadQuestionsAndLeads(event)
de nouveau. Et, oui, le fil essentiellement s'arrête lorsque larun()
méthode est terminée. Aprèsrun()
terminée, vous ne pouvez pas appelerstart()
de nouveau sur la même instance. Vous devez créer un nouveau.Merci Nate. J'ai essayé votre méthode. Mais le problème s'est produit à l'époque était, il a été de commencer un nouveau thread pour la nouvelle instance et thread précédent était également à l'œuvre.
OriginalL'auteur Nate
En plus de Nate réponse.
AnkitRox déclare dans son commentaire:
Donc il semble que le problème est "le fil conducteur est toujours en cours même si j'ai appelé interruption sur". Considérons cet exemple (il est laid, mais suffisamment pour montrer l'idée principale):
Note, le thread continue à fonctionner même après
interrupt()
a été appelé. Le résultat produit est:En fait le programme ne s'arrête jamais, sauf clôture de force. Alors que la
interrupt()
? Il configure simplement la interrompu drapeau àtrue
. Aprèsinterrupt()
a été appelé leThread.currentThread().isInterrupted()
commence à revenir,false
. Et c'est tout.Un autre cas est si
interrupt()
est appelée lorsque le thread est bloqué dans une invocation de l'une des méthodes de jeterInterruptedException
, alors que la méthode sera de retour en jetant leInterruptedException
. Et si thread du code "mange" que l'exception, le thread va encore continuer à fonctionner, considérons un exemple:Note, le thread continue à fonctionner même après
interrupt()
a été appelé. Le résultat produit est:Remarque, cette fois
interrupted = false
même aprèsinterrupt()
a été appelé. C'est parce que chaque fois queInterruptedException
est pris, les interrompu drapeau est remis àfalse
.En Java l'arrêt d'un thread est coopérative mécanisme. Le sens qu'il ne peut pas se faire sans la coopération du fil lui-même. Voici la version corrigée de l'échantillon ci-dessus:
Donc la bonne approche devrait être de vérifier périodiquement la interrompu drapeau. Et si l'état d'interruption est détectée puis il suffit de retourner le plus tôt possible. Une autre option est de ne pas utiliser
Thread.interrupt()
à tous, mais certains personnalisée boolean au lieu.OriginalL'auteur Vit Khudenko