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
Bonjours, je suis pas habitué des forums et c'est la premiere fois pour moi ici.

j'ai un Thread ou je ne sais quoi qui ne veut pas s'arreter.

Imaginer une Classe Runnable qui possede plusieurs classe privé runnable également.

jusqu'a la, pas de probleme.

Quand j'instancie cette fameuse classe c'est dans une autre classe dans laquelle je crée une arrayList pour le refiller dedans.

alors, je croyais que supprimant un item du arrayList(arraylist.remove(item)). il n'y aura plus de reference a cette instance..donc elle disparaitra. et bien non, elle continue a rouler et a agir.

j'ai meme ajouter dans la classe finalize des lignes pour arreter tout mes threads et les remttre a null, je ne comprend pas pourquoi ca continue a agir.
A voir également:

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
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).
0
Utilisateur anonyme
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:

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.

;-)
0
gfffffff
0