méthode d'interruption
Interruption signifie littéralement interruption, mais en Java, la méthode Thread.interrupt() notifie en fait le thread d'une manière ou d'une autre et ne termine pas directement le thread. C'est à la personne qui a écrit le code de décider quoi faire, et généralement nous abandonnons le fil de discussion.
Si le thread appelle la méthode wait(), wait(long) ou wait(long, int) de la classe Object, ou la méthode join(), join(long), join(long, int), sleep(long) ou sleep de la classe (long, int) est bloqué pendant la méthode, son statut d'interruption sera effacé et elle recevra également une InterruptedException.
Si le thread se bloque lors d'une opération d'E/S sur un canal interruptible (java.nio.channels.InterruptibleChannel), le canal sera fermé, l'état d'interruption du thread sera défini et le thread recevra une ClosedByInterruptException.
Si le thread est bloqué dans un sélecteur (java.nio.channels.Selector), l'état d'interruption du thread sera défini et il reviendra immédiatement de l'opération de sélection, éventuellement avec une valeur non nulle, comme si select était appelé Le réveil la méthode de l’appareil est la même.
Si aucune des conditions précédentes n'a été enregistrée, l'état d'interruption du thread sera défini.
L'interruption d'un thread inactif n'a aucun effet.
détecter une interruption
La manière dont l'interruption est détectée dépend de ce que fait le thread.
Si le thread appelle une méthode qui peut lancer InterruptException, interceptez l'InterruptException, puis gérez-la dans le bloc catch (en quittant généralement la méthode run pour interrompre le thread)
Si vous appelez d'autres méthodes, vous pouvez vérifier Thread.interrupted lorsqu'il est inactif pour déterminer si un signal d'interruption est reçu et le traiter après avoir confirmé que le signal d'interruption est reçu. Une InterruptException peut être levée pour être cohérente avec la méthode de gestion précédente
état d'interruption
Le mécanisme d'interruption du thread est implémenté à l'aide de l'indicateur interne de l'état d'interruption. L'état de l'interruption est défini lorsque la méthode interruption() du thread est appelée (voir la description de la méthode d'interruption ci-dessus).
Il existe deux manières d'obtenir l'état d'interruption d'un thread :
Appelez la méthode statique Thread.interrupted() En plus de renvoyer l'état d'interruption du thread actuel, cette méthode efface également l'état d'interruption du thread actuel. En d'autres termes, si cette méthode est appelée deux fois de suite, le deuxième appel retournera false (une fois que le premier appel aura effacé son état d'interruption et avant que le deuxième appel n'ait vérifié l'état d'interruption, le thread en cours est à nouveau interrompu. exceptions ).
Appelez la méthode isInterrupted() du thread spécifié. Cette méthode renvoie uniquement l'état d'interruption du thread spécifié sans affecter l'état d'interruption du thread.
Il existe deux manières d'effacer l'état d'interruption d'un thread :
Comme mentionné ci-dessus, appeler Thread.interrupted()
Lorsque la méthode interruption() du thread est appelée pour provoquer InterruptedException, l'état d'interruption du thread a été effacé en même temps, y compris la méthode wait(), wait(long) ou wait(long, int) de l'Object. classe, ou la méthode join() , join(long) , join(long, int) , sleep(long) ou sleep(long, int) du thread