Existe-t-il un moyen de forcer une Thread
à s’arrêter sous Java 8 , maintenant que Thread.stop
a été supprimé? Cela inclut forcer un thread en attente sur une boucle lock/synchronized/sleep/wait/infinite à s'arrêter.
Ceci est prévu en tant que partie d'un chien de garde pour l'application qui peut détecter si elle a bloqué/bloqué , forcer les threads de suppression, puis enregistrer l'état actuel pour éviter la perte d'informations - alors qu'il y a une forte probabilité de ces informations étant corrompues en raison de l’arrêt forcé d’un thread, il est préférable d’avoir une copie des informations éventuellement incorrectes que de les perdre.
Il est impossible de sauvegarder ces informations sans arrêter les threads verrouillés, car leur sauvegarde nécessitera l’acquisition de verrous.
Si vous avez vraiment besoin d'arrêter un Thread
à la dure, vous pouvez considérer que la méthode Thread.stop()
(sans fournir une Throwable
arbitraire) fonctionne toujours avec Java 8. Elle générera une ThreadDeath
sur le thread arrêté qui peut être traité comme n'importe quel autre Error
, malgré son nom inhabituel. La seule différence est qu'aucune trace de pile ne sera imprimée si ThreadDeath
n'est pas intercepté.
Mais attention, cette méthode est déconseillée pour la plupart des mêmes raisons que l’autre méthode stop
. Cela pourrait devenir non pris en charge dans l'une des prochaines versions de Java. Il est donc encore temps de penser à un plan B…
Lisez ces articles, ils l'expliquent:
"Pourquoi Thread.stop, Thread.suspend, Thread.resume et Runtime.runFinalizersOnExit sont-ils déconseillés?" http://docs.Oracle.com/javase/1.5.0/docs/guide/misc/ threadPrimitiveDeprecation.html
Joshua Bloch: "Effective Java (2nd Edition)", élément 66: Synchroniser l'accès à des données mutables partagées
Joshua Bloch explique comment arrêter un thread et dit ceci:
Considérez la tâche d’arrêter un fil d’un autre. Les bibliothèques Fournissent la méthode Thread.stop, mais cette méthode est obsolète depuis longtemps Car elle est intrinsèquement dangereuse. Son utilisation peut entraîner une corruption des données . N'utilisez pas Thread.stop. Une méthode recommandée pour arrêter un thread D'un autre consiste à demander au premier thread d'interroger un champ booléen Initialement faux, mais pouvant être défini sur true par le second thread sur . que le premier fil est de s'arrêter.
Lorsque vous utilisez cette technique, vous devez également gérer la synchronisation du champ booléen. Je ne veux pas copier trop de choses du livre de Joshua Bloch, mais vous trouverez tout ce qu'il y a dans la documentation officielle d'Oracle Java mentionnée ci-dessus.
La bonne façon d'arrêter un fil est d'appeler interrupt
dessus.