Thread qui ne pas arreter [JAVA]
Résolu/Fermé
xvirus
Messages postés
6
Date d'inscription
mercredi 15 février 2006
Statut
Membre
Dernière intervention
1 juin 2007
-
10 janv. 2007 à 07:44
lilidona - 7 déc. 2007 à 17:34
lilidona - 7 déc. 2007 à 17:34
A voir également:
- Thread qui ne pas arreter [JAVA]
- Waptrick java football - Télécharger - Jeux vidéo
- Java apk - Télécharger - Langages
- Jeux java itel football - Télécharger - Jeux vidéo
- Java jre - Télécharger - Langages
- Jeux java itel 5360 ✓ - Forum Mobile
3 réponses
kij_82
Messages postés
4088
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
30 septembre 2013
857
10 janv. 2007 à 10:43
10 janv. 2007 à 10:43
Quand tu instancie un thread, c'est la même chose qu'un objet en effet. Donc si tu le stock dans un tableau pour le mettre en mémoire et l'utiliser par la suite c'est bon.
Mais puisqu'il s'agit ici d'un thread, à partir du moment ou tu lance le thread (méthode start) celui-ci devient "autonome". Lorsque tu efface le lien dans le tableau, le thread est toujours là, car il tourne et n'est pas "inutile".
En effet, lorsque tu ne pointe plus sur une variable normale et qu'elle n'est donc plus utile au programme, le garbage collector de Java vient ramasser cette variable inutilisée pour la désallouée. Ca se fait tout seul, c'est transparent. Et dans ce cas, ta variable n'existe plus.
Dans ton cas, il s'agit d'un thread qui tourne, donc qui n'es pas inactif, donc le garbage collector ne le supprime pas.
Conclusion, puisque tu as la référence sur ton thread dans ton tableau, là ou tu supprime la référence du tableau, juste avant de supprimer il faut que tu arrete ton thread via la méthode stop.
Ou alors, méthode un peu moins propre, il se peut que ce soit le garbage collector qui fasse mal son boulot, ou qui ne viens pas assez tot pour supprimer le thread. Dans ce cas tu peux tenter d'y faire appel, juste apres la suppression de la référence du tableau de la maniere suivante :
system.gc(); (ou un truc dans le genre, je ne sais plus).
Mais puisqu'il s'agit ici d'un thread, à partir du moment ou tu lance le thread (méthode start) celui-ci devient "autonome". Lorsque tu efface le lien dans le tableau, le thread est toujours là, car il tourne et n'est pas "inutile".
En effet, lorsque tu ne pointe plus sur une variable normale et qu'elle n'est donc plus utile au programme, le garbage collector de Java vient ramasser cette variable inutilisée pour la désallouée. Ca se fait tout seul, c'est transparent. Et dans ce cas, ta variable n'existe plus.
Dans ton cas, il s'agit d'un thread qui tourne, donc qui n'es pas inactif, donc le garbage collector ne le supprime pas.
Conclusion, puisque tu as la référence sur ton thread dans ton tableau, là ou tu supprime la référence du tableau, juste avant de supprimer il faut que tu arrete ton thread via la méthode stop.
Ou alors, méthode un peu moins propre, il se peut que ce soit le garbage collector qui fasse mal son boulot, ou qui ne viens pas assez tot pour supprimer le thread. Dans ce cas tu peux tenter d'y faire appel, juste apres la suppression de la référence du tableau de la maniere suivante :
system.gc(); (ou un truc dans le genre, je ne sais plus).
Utilisateur anonyme
22 janv. 2007 à 12:19
22 janv. 2007 à 12:19
Salut !
Tu dois prévoir une condition de sortie de ton Thread.
Imaginons que le code de ton Thread ressemble à ceci:
Dans le code qui instancie et lancee ton Thread, tu devrais retrouver quelque chose du style:
Contrairement à ce que dit kij_82, l'appel de Sytem.gc() ne suffit pas à stopper les Thread.
;-)
Tu dois prévoir une condition de sortie de ton Thread.
Imaginons que le code de ton Thread ressemble à ceci:
public class MyThread extends Thread{ private boolean isRunning; public MyThread(){ super(); isRunning=fase; } public void run(){ isRunning=true; while(isRunning){ //Ton code ici } } public void setRunning(boolean isRunning){ this.isRunning=isRunning; }
Dans le code qui instancie et lancee ton Thread, tu devrais retrouver quelque chose du style:
MyThread th = new MyThread(); ... th.start(); ... if(<une_condition>){ th.setIsRunning(false);//Cette ligne va stopper ton thread myThreadList.remove(th);//enlèvement de ton thread de la liste de threads th=null;//conseillé System.gc();//éventuellement. }
Contrairement à ce que dit kij_82, l'appel de Sytem.gc() ne suffit pas à stopper les Thread.
;-)