J'ai le code suivant:
renderThread = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10000000; i++) {
System.out.println("Number: " + i);
}
}
});
renderThread.start();
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
renderThread.interrupt(); //It should stop, but it does not stop.
renderThread.interrupt()
n'interrompt pas le thread, il continue à s'exécuter. Si je remplace renderThread.interrupt()
par .stop()
, le thread s'arrête. Cependant, .stop()
est obsolète . Alors, quelle est la bonne façon d'arrêter un thread si stop
est obsolète et que interrupt
ne fonctionne pas?
Lorsque vous appelez interrupt (), un indicateur booléen indique à la fonction d'exécution de s'arrêter. C'est pourquoi j'écris habituellement mes fonctions d'exécution comme ceci.
void run()
{
while(!Thread.interrupted())
{
//Do something
}
}
Ce n’est pas parce que vous appelez interrompre que le fil de discussion s’arrête immédiatement ou du tout. Cela dépend de ce qui est dans la fonction d'exécution.
Pour vraiment pousser le point pourquoi vous ne devriez pas utiliser Thread.stop()
?
Doug Lea a récemment mentionné que Thread.stop serait la première méthode non implémentée pour Java come Java 8.
Sa réponse à ce commentaire de quelqu'un:
En outre, une autre chose synchronisée a pour aller c'est qu'il gère abandonne async des threads (c'est-à-dire thread.stop ()). Je sais que stop () est obsolète et tout, mais on ne sait jamais.
Était:
Mais vous savez! À partir de JDK8, Thread.stop est vraiment parti. C'est le première méthode obsolète à avoir été réellement désimplémentée. Maintenant lève simplement UnsupportedOperationException.
http://cs.oswego.edu/pipermail/concurrency-interest/2013-December/012028.html
Vous devriez jeter un oeil à cet article: http://10kloc.wordpress.com/2013/03/03/Java-multithreading-steeplechase-stopping-threads/
En gros, vous ne devriez pas ARRÊTER un thread (non sécurisé), mais l'interrompre . Ce qui vous manque, c'est que le thread gère l'interruption.
Tout ce que vous avez besoin de faire pour interrompre le thread en cours ou mettre fin au processus en cours est d’ajouter Ajouter l’instruction ci-dessous dans votre bloc catch
try
{
Thread.sleep(4000);
System.out.println("VAS CONSULTING")
}
catch(InterruptedException e)
{
//Stop printing out VAS CONSULTING
return; /*This will terminate the thread*/
}
également si une méthode qui ne déclenche pas d'exception interrompue n'est pas utilisée dans la méthode d'exécutionvous pouvez le faire pour gérer l'interruption de thread ou mettre fin au thread.
@Override
public void run()
{
System.out.println("VAS CONSULTING");
if(Thread.Interrupted())
{
doSomethingElse();//process something else within the thread
return; //Terminates the current Thread
}
}
J'espère que cela vous aide ou aide quelqu'un d'autre.
renderThread.interrupt () n'interrompt pas le fil, il continue courir.
interrupt()
est appelée, son statut d'interruption est défini.wait
de la classe Object ou des méthodes Thread.join
et Thread.sleep
de cette classe, son l'état de l'interruption sera effacé et il recevra une InterruptedException
.Par exemple:
Thread t = new Thread()
{
public void run()
{
try {
for(int i=0; i<10000;i++)
System.out.println("Is interrupTed? "+this.isInterrupted());
Thread.sleep(200);
} catch (InterruptedException ex) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE, null, ex);
}
}
};
t.start();
t.interrupt();
}
Le code ci-dessus, j’ai utilisé une boucle for
pour intercepter le drapeau d’interruption avec isInterrupted()
function et l’a imprimé. Comme t.interrupt()
est appelé, isInterrupted()
renverra true
que vous verrez dans la console. Dès qu'il atteindra la Thread.sleep(miliTime)
, vous verrez que InterruptedException
est capturé et lancé comme indiqué ci-dessus.
Arrêter un fil:
vous pouvez utiliser cet indicateur isInterrupted()
pour vérifier si une interrupt()
a été appelée et renvoyer à partir de l'exécution:
Par exemple:
Thread t = new Thread()
{
public void run()
{
long executeTime = System.currentTimeMillis() ;
int i = 0;
for(; i<10000 && !this.isInterrupted();i++)
System.out.println("Is interrupted? "+this.isInterrupted());
System.out.println("Was Interrupted? "+this.isInterrupted()
+" after cycle: "+ i);
System.out.println("Time it gets Executed: "
+(System.currentTimeMillis() - executeTime+" ms"));
}
};
t.start();
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
t.interrupt();
Pendant l’exécution du code ci-dessus: j’ai envoyé le thread principal en veille pour 200
dans la fonction principale statique afin de permettre au thread démarré t
de s’exécuter pendant un certain temps. Puis j'ai invoquét.interrupt()
qui provoque l’arrêt de la boucle for
et l’impression d’une sortie comme suit:
Was Interrupted? true after cycle: 1477
Time it gets Executed: 258 ms
Ce qui indique que la boucle for
a l'itération 1148
avant que t.interrupt();
soit invoquée dans la fonction main
.
Veuillez lire la documentation de Thread.interrupt()
function pour plus de détails.
la méthode interrupt () n'arrête pas le thread. lisez ceci pour une explication plus détaillée http://www.ibm.com/developerworks/Java/library/j-jtp05236/