7
votes

Comment détruire le fil en Java après l'achèvement de la tâche

J'utilise une piscine de fil pour ma tâche. Après avoir terminé chaque tâche, je détruisez le thread en utilisant thread.stop () et thread.destroy () . Mais après avoir exécuté ma candidature (en Eclipse) pendant environ 30 minutes. Je reçois une mémoire d'erreur liée.

S'il vous plaît me suggérer comment tuer le fil.


0 commentaires

4 Réponses :


14
votes

Si vous utilisez une piscine de thread, vous ne devez pas terminer le fil pour commencer - tout le point d'une piscine de thread est de réutiliser les filets.

Si vous ne veux pas réutiliser le fil, alors démarrez simplement un nouveau fil au lieu d'utiliser une piscine de fil - et laissez simplement le fil mourir, au lieu d'appeler arrêter ou détruire. Ces méthodes sont obsolètes pour une bonne raison - elles ne devraient essentiellement pas être appelées.

Ce n'est pas vraiment clair comment cela entraînerait une exception hors mémoire, cependant - y a-t-il une raison pour laquelle vous vous concentrez sur le filetage comme cause probable?


0 commentaires

4
votes

Lorsque la tâche est terminée, le thread exécuté doit revenir. Ne rien faire. Cela prendra soin des choses.


0 commentaires

5
votes

Renforcer ce que @jon Skeet a dit, c'est une très mauvaise idée d'appeler le déprécié threads.stop () ou thread.destroy () méthodes.

Selon le javadoc, thread.destroy () était fondamentalement dangereux et n'a jamais été mis en œuvre. L'idée originale était simplement de tuer le fil et de briser toutes ses serrures de moniteur. Si cela est arrivé au milieu de la mise à jour d'une structure de données partagée, la structure de données serait laissée dans un état indéterminé. D'autres threads en attente du fil tué pour notifier que certains objets attendraient à jamais.

thread.stop () provoque une exception à la filetage à une exception inattendue (au code qui a été touché). Il est un peu plus ordonné que tuer un fil, mais à moins que tout le fil arrêté (y compris tout ce que cela appelle) est soigneusement écrit avec enfin des blocs pour notifier les serveurs, restaurez des structures de données, etc. avoir le même problème.

Reportez-vous à Déprécation primitive de java Pour toute l'histoire.


1 commentaires

Oui, très dangereux. J'ai souvent bloqué que le seul moyen sûr de tuer un fil est avec système.exit ().



0
votes

En mode de débogage, les threads ne sont pas effacés par le collecteur des ordures. Essayez d'exécuter l'application au lieu d'exécuter en mode de débogage et tout devrait être bien.


0 commentaires