web-dev-qa-db-fra.com

Interrompre ou arrêter un thread endormi

Comment arrêter ou interrompre un thread endormi en Java.? J'ai un thread qui synchronise les données et qui dort pendant 10 minutes dans la méthode run (), si je veux arrêter la synchronisation en arrêtant le thread lorsqu'il est en sommeil.? Comment cela peut il etre accompli?

21
Suresh

Appelez la méthode interrupt () sur votre thread. Cela entraînera l'annulation du sommeil et une exception InterruptedException sera levée.

19
Fredrik Wallenius

Vous pouvez interrompre un thread dormant avec Thread.interrupt(). Maintenant, arrêter un thread est obsolète - que se passe-t-il si le thread détient un verrou sur quelque chose? (Il y avait une Thread.stop(), mais elle est fortement déconseillée).

Alternativement, au lieu de dormir, vous pouvez demander à votre thread d'attendre qu'un objet soit notifié avec un délai d'expiration et simplifier notifier l'objet si vous souhaitez que le thread se réveille.

11
EboMike

Bien sûr, je souhaite prêter attention à un problème. Les méthodes interrupt () elles-mêmes n'interrompent pas le thread. Il envoie simplement une demande d'interruption à un thread, en définissant l'indicateur sur true. Habituellement, votre thread doit traiter la politique d'annulation/interruption. Il est largement décrit dans Java Concurrecy in Practice, section 7.1 Annulation de tâche.

Les méthodes de bibliothèque de blocage telles que Thread.sleep et Object.wait essaient de détecter quand un thread a été interrompu et retournent tôt. Ils répondent à l'interruption en effaçant l'état interrompu et en lançant InterruptedException.

6
Alexandr

Frederik a raison: appelez Thread.interrupt (); Je voulais juste vous avertir ne pas utiliser stop () car il est obsolète depuis Java 1.1. Et autre avertissement. Je pense que si vous utilisez sleep () et souhaitons interrompre le thread c'est un bon moment pour penser à passer à wait () et notify (). Il existe de nombreux tutoriels sur les fils Java et le javadoc de Java.lang.Thread est assez bon, vous pouvez donc continuer à y lire si vous n'êtes pas familier avec ces API.

2
AlexR

Comme je ne peux pas commenter, je posterai une autre réponse. Je veux juste renforcer et clarifier ce qu'a dit Alexandr. interrupt() définit uniquement un indicateur dans Thread, et l'objet Thread ou Runnable étendu doit vérifier s'il a été interrompu avec Thread.interrupted() pour faire ce qu'il est censé faire en cas d'interruption.

interrupt() arrête également une wait() ou sleep(), mais faites attention à ce que ces méthodes ANNULENT l'indicateur d'interruption. Ainsi, si vous appelez interrupt() sur un thread en attente/en sommeil, il arrêtera de dormir/en attente mais ne saura pas qu'il a été interrompu, sauf si vous interceptez l'exception et ne continuera pas d'être interrompu.

J'ai pu corriger un de mes programmes en implémentant mon propre indicateur d'interruption, qui ne pouvait pas être remplacé par les méthodes sleep() et wait(). Sachez également que vous pouvez interrompre un thread de l'intérieur avec Thread.currentThread().interrupt().

1
GuiRitter