2010-11-24 27 views
18

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

+2

La duplication exacte n'est plus là :-( –

+1

Cette question doit-elle être rouverte car son doublon a été supprimé par l'auteur? – Craigy

Répondre

19

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

+2

Que faire si le thread ne dort pas, et je veux quand même faire quelque chose comme Thread.sleep? – Jaydev

11

Vous pouvez interrompre un fil dormant avec Thread.interrupt(). Maintenant, arrêter un thread est déconseillé - et si le thread tient un verrou sur quelque chose? (Il y avait un Thread.stop(), mais il est fortement déconseillé). Alternativement, au lieu de dormir, vous pouvez demander à votre thread d'attendre qu'un objet soit notifié avec un timeout, et simplifier la notification à l'objet si vous voulez que le thread se réveille.

2

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

6

Suresh, je souhaite faire attention à un problème. Les méthodes interrupt() n'interrompent pas le thread. Il envoie juste une demande à un thread pour l'interruption, en mettant l'indicateur à true. Habituellement, votre thread doit traiter la politique d'annulation/interruption. Il est grandement décrit dans Java Concurrecy in Practice, section 7.1 Annulation de tâche.

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

1

Puisque 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 le Thread, et l'objet étendu Thread ou Runnable doit vérifier s'il a été interrompu avec Thread.interrupted() pour faire ce qu'il est censé faire lorsqu'il est interrompu.

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

J'ai été en mesure de réparer un de mes programmes en mettant en œuvre mon propre drapeau d'interruption, qui ne pouvait pas être remplacé par les méthodes sleep() et wait(). En outre, sachez que vous pouvez interrompre un fil de l'intérieur avec Thread.currentThread().interrupt().