Le mécanisme d'interruption de thread est le moyen privilégié pour qu'un thread (coopérant) réponde à une demande d'arrêt de son activité. Tout thread (y compris le thread lui-même, je pense) peut appeler interrupt()
sur un fil.
En pratique, les cas d'utilisation normaux de interrupt()
impliquent une sorte de cadre ou de gestionnaire qui demande à un fil de travail d'arrêter ce qu'il est en train de faire. Si le fil de travail est "conscient des interruptions", il remarquera qu'il a été interrompu par une exception ou en vérifiant périodiquement son drapeau d'interruption. Lorsqu'il s'aperçoit qu'il a été interrompu, un thread qui se comporte bien abandonne ce qu'il est en train de faire et se termine.
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 fil de travail. Et lorsqu'il est interrompu, votre code doit abandonner ce qu'il est en train de faire et se terminer par le moyen le plus approprié. Selon la façon dont votre code a été appelé, cela peut se faire 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 existe d'autres threads qui doivent être interrompus par le framework).
D'un autre côté, si votre code n'est pas conçu pour être exécuté sous le contrôle d'un framework, vous pourriez argumenter que l'option InterruptedException
est une exception inattendue, c'est-à-dire un bogue. Dans ce cas, vous devez traiter l'exception comme vous le feriez pour d'autres bogues, c'est-à-dire l'envelopper dans une exception non vérifiée, l'attraper et l'enregistrer au même moment que vous traitez les autres exceptions non vérifiées inattendues. (Alternativement, votre application pourrait simplement ignorer l'interruption et continuer à faire ce qu'elle faisait).
UPDATE
Si je n'interromps jamais moi-même d'autres threads, qu'est-ce qui peut déclencher une InterruptedException ?
Par exemple, si votre Runnable
sont exécutés à l'aide d'un ExecutorService
y shutdownNow()
est appelé sur le service. Et en théorie, n'importe quel pool de threads ou cadre de gestion de threads tiers pourrait légitimement faire quelque chose comme ça.