Tout d'abord, il faut déjà comprendre ce que veut dire déprécié. Si nous passons rapidement par le dictionnaire du
CNRTL,
nous trouvons la définition suivante :
Citation : CNRTL
- faire baisser la valeur de (quelque chose), diminuer sa valeur ;
- rabaisser la valeur de (quelque chose), porter des jugements défavorables sur ;
- Rabaisser (la valeur ou le mérite de) ; porter ou exprimer un jugement défavorable sur.
Ce que nous retiendrons pour notre usage informatique, est qu'une méthode dépréciée est
à éviter. Si elle est dépréciée, c'est qu'il existe une alternative pour faire la même chose ou mieux.
Maintenant, passons aux raisons de la dépréciation. Ce n'est pas parce que la méthode est moins optimisée qu'une autre, mais bien parce qu'elle est dangereuse d'utilisation et induit des comportements aléatoires.
Pour expliciter cela, regardons rapidement la documentation :
Citation : JavadocDeprecated. This method is inherently unsafe. Stopping a thread with Thread.stop causes it to unlock all of the monitors that it has locked (as a natural consequence of the unchecked ThreadDeath exception propagating up the stack). If any of the objects previously protected by these monitors were in an inconsistent state, the damaged objects become visible to other threads, potentially resulting in arbitrary behavior. Many uses of stop should be replaced by code that simply modifies some variable to indicate that the target thread should stop running. The target thread should check this variable regularly, and return from its run method in an orderly fashion if the variable indicates that it is to stop running. If the target thread waits for long periods (on a condition variable, for example), the interrupt method should be used to interrupt the wait. For more information, see Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?.
En résumé, cette méthode n'est pas sûre. L'utiliser pour arrêter un
thread provoque le déverrouillage de toutes les ressources utilisées par le dit
thread. Si une de ces ressources n'était pas dans un état stable, elle va être rendue accessible dans son état instable, ayant pour effet un comportement incontrôlable et aléatoire lors de l'usage de la ressource par d'autres
threads. La documentation explique ensuite une méthode simple et générique d'arrêt « propre » de vos
threads, et vous renvoie vers un lien si vous voulez en savoir plus sur le pourquoi du comment.
Pour mieux comprendre le problème, rien ne vaut un exemple.
Imaginons deux
threads qui accèdent à un objet « Personne », l'un pour écrire, l'autre pour lire.
Le code est bien fait, les deux
threads ne peuvent accéder à l'objet en même temps. Maintenant, imaginons que l'objet « Personne » réponde à un instant « t » aux valeurs suivantes : {Prénom = Sophie, Nom = Dupond, âge = 23 ans, taille = 170 cm, salaire = 32000 ? / an}. Le premier
thread va pour le modifier en {Jean, Durant, 2 ans, 65 cm, 0 ? / an}. Il commence sa besogne, mais au milieu de son travail, il se fait arrêter (par
Thread.stop
). Il se ferme et le verrou se libère. Or, il se trouve que le deuxième
thread était justement en attente de la libération de ce verrou pour lire l'objet. Il va donc pour effectuer sa lecture, mais lit {Jean, Durant, 3 ans, 170 cm, 32000 ? / an} parce que le premier
thread n'a pas eu le temps de finir son écriture avant d'être fermé. Les valeurs que le deuxième
thread récupère sont erronées et surtout inexploitables ! Elles ne correspondent à personne. Il va donc travailler avec de « mauvaises » valeurs, produisant bien entendu un résultat incohérent.
On ne peut prédire ce que le premier
thread aura modifié dans l'objet lors de son arrêt. C'est en ce sens que le comportement du reste du programme va devenir aléatoire. On n'a aucune idée de l'état dans lequel seront les données.
Je vous ai fait un exemple avec un objet « Personne » pour faire simple, mais vous pouvez remplacer cet objet par n'importe quelle autre action ou ressource ; vous comprendrez alors que les conséquences d'un code approximatif, dont on ne contrôle pas parfaitement la portée, peuvent être désastreuses.