Le mécanisme d'interruption de thread est le moyen préféré pour qu'un thread (coopérant) réponde à une demande d'arrêt de ce qu'il fait. N'importe quel fil (y compris le fil lui-même je pense) pourrait appeler interrupt()
un fil.
En pratique, les cas d'utilisation normaux interrupt()
impliquent une sorte de cadre ou de gestionnaire indiquant à un thread de travail d'arrêter ce qu'il fait. Si le thread de travail est "sensible aux interruptions", il remarquera qu'il a été interrompu via une exception, ou en vérifiant périodiquement son indicateur d'interruption. En remarquant qu'il a été interrompu, un thread bien comporté abandonnerait ce qu'il fait et se terminerait.
En supposant le cas d'utilisation ci-dessus, votre code est susceptible d'être interrompu s'il est exécuté dans un cadre Java ou à partir d'un thread de travail. Et quand il est interrompu, votre code doit abandonner ce qu'il fait et se terminer par les moyens les plus appropriés. Selon la façon dont votre code a été appelé, cela peut être fait en retournant ou en lançant une exception appropriée. Mais il ne devrait probablement pas appeler System.exit()
. (Votre application ne sait pas nécessairement pourquoi elle a été interrompue, et elle ne sait certainement pas s'il y a d'autres threads qui doivent être interrompus par le framework.)
D'un autre côté, si votre code n'est pas conçu pour s'exécuter sous le contrôle d'un framework, vous pouvez affirmer qu'il InterruptedException
s'agit d'une exception inattendue; c'est à dire un bug. Dans ce cas, vous devez traiter l'exception comme vous le feriez pour les autres bogues; par exemple, enveloppez-le dans une exception non vérifiée, et attrapez-la et enregistrez-la au même moment où vous traitez avec d'autres exceptions non vérifiées inattendues. (Sinon, votre application pourrait simplement ignorer l'interruption et continuer à faire ce qu'elle faisait.)
1) Si je n'interromps jamais moi-même d'autres threads, qu'est-ce qui peut déclencher une InterruptedException?
Un exemple est si vos Runnable
objets sont exécutés à l'aide d'un ExecutorService
et shutdownNow()
est appelé sur le service. Et en théorie, tout pool de threads tiers ou cadre de gestion de threads pourrait légitimement faire quelque chose comme ça.
2) Si je n'interromps jamais moi-même d'autres threads en utilisant interrupt () ... que signifie InterruptedException
alors? Que dois-je faire en attrapant un? Arrêter mon application?
Vous devez analyser la base de code pour déterminer ce qui fait les interrupt()
appels et pourquoi. Une fois que vous avez compris cela, vous pouvez déterminer ce que >> votre << partie de l'application doit faire.
Jusqu'à ce que vous sachiez pourquoi InterruptedException
est jeté, je vous conseillerais de le traiter comme une grave erreur; par exemple, imprimez une trace de pile dans le fichier journal et arrêtez l'application. (Évidemment, ce n'est pas toujours la bonne réponse ... mais le fait est qu'il s'agit d'un "bogue", et il doit être porté à l'attention du développeur / mainteneur.)
3) Comment savoir qui / quoi appelle interrupt()
?
Il n'y a pas de bonne réponse à cela. Le mieux que je puisse suggérer est de définir un point d'arrêt sur le Thread.interrupt()
et de regarder la pile d'appels.