Voici ma tentative de répondre à ma propre question.
Je pense que les conditions suivantes doivent être suffisants pour qu'un seul thread à être arrêté en toute sécurité à l'aide de Thread.stop()
:
- L'exécution du thread ne doit pas créer ou de muter un état (c'est à dire des objets Java, de variables de classe, des ressources externes) qui peuvent être visibles par les autres threads dans le cas où le fil est arrêté.
- L'exécution du thread ne doit pas utiliser
notify
de n'importe quel autre thread au cours de son exécution normale.
- Le fil ne doit pas
start
ou join
autres threads, ou d'interagir avec les ensuite à l'aide d' stop
, suspend
ou resume
.
(Le terme de l'exécution du thread ci-dessus couvre tous au niveau de l'application du code et de toutes les bibliothèques de code qui est exécuté par le thread.)
La première condition signifie qu'un arrêté thread va pas laisser externe des structures de données ou de ressources dans un état incohérent. Cela comprend des structures de données qu'il peut accéder (en lecture) à l'intérieur d'un mutex. La deuxième condition signifie qu'un stoppable thread ne peut pas laisser un autre thread en attente. Mais il a également interdit l'utilisation de tout mécanisme de synchronisation d'autres que simple objet mutex.
Un stoppable thread doit avoir un moyen de livrer les résultats de chaque calcul de la thread de contrôle. Ces résultats sont créé / muté par la stoppable thread, donc nous avons simplement besoin de s'assurer qu'ils ne sont pas visibles à la suite d'un thread arrêter. Par exemple, les résultats pourraient être affectés à des membres privés de l'objet Thread et "surveillé" avec un drapeau automatiquement par le thread pour dire que c'est "fait".
EDIT: Ces conditions sont très restrictives. Par exemple, pour un "évaluateur de regex" thread pour être arrêté en toute sécurité, si nous devons garantir que le moteur d'expressions régulières ne pas muter tout visible de l'extérieur de l'état. Le problème est qu'il peut faire, en fonction de comment mettre en œuvre le fil!
- L'
Pattern.compile(...)
méthodes peut mettre à jour un statique de cache de compilation
les modèles, et s'ils le faisaient, ils seraient (devez) utiliser un mutex pour le faire. (En fait, l'OpenJDK version 6.0 ne met pas en cache les Modèles, mais le Soleil pourrait changer cela.)
- Si vous essayez d'éviter 1) par la compilation de l'expression régulière dans le contrôle de filetage et la fourniture d'une pré-instancié
Matcher
, alors que l'expression régulière thread ne muter visible de l'extérieur de l'état.
Dans le premier cas, nous serions probablement en difficulté. Par exemple, supposons qu'une table de hachage a été utilisé pour mettre en œuvre le cache et que le thread a été interrompu lors de la table de hachage a été réorganisé.
Dans le second cas, nous serions OK à condition que l' Matcher
n'avaient pas été transmis à un autre thread, et à condition que le contrôleur de fil n'essayez pas d'utiliser l' Matcher
après l'arrêt de la regex comparateur de fil.
Alors, où sommes-nous?
Eh bien, je pense avoir identifié les conditions dans lesquelles les threads sont théoriquement arrêter. Je pense aussi qu'il est théoriquement possible de manière statique d'analyser le code d'un thread (et les méthodes qu'il appelle) pour voir si ces conditions sont toujours tenir. Mais, je ne sais pas si c'est vraiment pratique.
Est-il logique? Ai-je raté quelque chose?
EDIT 2
Les choses deviennent un peu plus poilu quand vous considérez que le code que nous pourrions être en train d'essayer de tuer pourrait être non fiables:
Nous ne pouvons pas compter sur les "promesses"; par exemple, les annotations sur du code non fiable qu'il est soit tuables, ou pas tuables.
Nous avons réellement besoin pour être en mesure d'arrêter la non approuvé le code de faire des choses qui font qu'il peut être tué ... selon les critères établis.
Je soupçonne que cela entraînerait la modification de la JVM de comportement (par exemple, la mise en œuvre d'exécution des restrictions de ce que les threads sont autorisés pour le verrouiller ou le modifier), ou d'une mise en œuvre complète des Isolats JSR. C'est au-delà de la portée de ce que je considérais comme "fair game".
Permet donc la règle du code non fiable cas pour l'instant. Ou au moins, reconnaissez que le code malveillant peut faire des choses pour les rendre lui-même pas tuables en toute sécurité, et de mettre ce problème de côté.