Partage
  • Partager sur Facebook
  • Partager sur Twitter

thread

    13 février 2012 à 1:15:05

    bonsoir, je realise un programme ou j'ai une interface avec deux boutons, l'un ajoute un objet animal (qui de deplace aleatoirement dans la fenetre et l'autre bouton est un clear qui est censé detruire le dernier animal ajouter.
    Chaque animal declenche une methode run() et son thread.

    Je tourne en rond sur comment detruire le dernier animal ajouté... comment feriez vous pour faire ça ?

    j'avais des idées mais je sais pas si elles sont bonnes ou pas (detruire le dernier thread, stocker chaque animal dans une liste et detruire le dernier element)
    • Partager sur Facebook
    • Partager sur Twitter
      13 février 2012 à 1:34:38

      Salut, je réalise moi même un programme dans ce style en ce moment, chaque unité n'a pas son propre thread, mais j'ai un thread qui s'occupe de tous les faire bouger les uns après les autres (ton idée me plait bien remarque, mais ça fait un paquet de threads quand on approche de la centaine d'unités ^^).
      Je stocke donc toutes mes unités dans une ArrayList, et pour les supprimer je parcours simplement la liste avec un Iterator, et j'utilise la méthode remove().

      Ensuite pour les threads, sachant que je supprime parfois l'objet dans lequel j'ai toutes les unités et donc aussi mon thread, j'utilise une boucle infinie avec un booléen, que je met à false juste avant de supprimer mon objet, histoire qu'il ne continue pas de tourner pour rien et se supprime de lui-même.

      J'espère que tu y vois plus clair :)
      • Partager sur Facebook
      • Partager sur Twitter
        13 février 2012 à 9:41:48

        Dans un premier temps tu devras stocker "physiquement" chaque animal dans une structure adaptée :
        - ArrayList (Le dernier objet ajouté sera le dernier de la liste)
        - LinkedList (Le dernier objet ajouté sera le premier de la liste)

        Au niveau des threads maintenant. La plupart des méthodes sont dépréciées donc on prévoit un mécanisme pour le fermer : un booléen.
        - http://java.developpez.com/faq/java/?p [...] READ_terminer
        - http://www.siteduzero.com/tutoriel-3-1 [...] -en-java.html

        Globalement dans la méthode run() tu réalises une boucle while avec une variable booléenne qui sera toujours "Vraie" tant qu'une méthode ne la passe pas à "Faux" (appelons la stop())

        Maintenant pour supprimer ton animal :
        - On le cherche dans la liste
        - On arrête le thread : méthode stop crée
        - On le supprime de la liste

        • Partager sur Facebook
        • Partager sur Twitter
          13 février 2012 à 11:31:49

          Salut, pour information il existe des api standard qui permette de gérer facilement les thread sans avoir besoin de les detruire etc. Regarde la classe Executors.
          tu créé un ThreadPoolExecutor.newCachedThreadPool() ce qui permet de créer un pool de thread qui sera géré de maniere autonome si un thread est nécessaire alors il en créé un sinon si le thread n'est plus utilisé depuis trop longtemp alors il le détruit.
          Du coup tu n'as plus qu'as faire la gestion des instance s de ta classe Animal, qui elle demandera le ThreadPoolExecutor et fera execute ou submit dessus(le 2ieme c'est lorsque que l'on souhaite avoir un objet en retour). Plus une methode qui s'appelle destroy sur Animal et qui fait Thread.currentThread.interrupt(), tu peut meme ajouter dans cette méthode la suppression de lui-même dans la liste.
          Le interrupt ici est nécessaire que si l'Animal utilise constamment l'execution d'un thread.
          Le faite d'utiliser les Executors permet de s'affranchir de la gestion des thread mais si tu veut que tout tes thread soit en parallèle il te suffit d'appeler les runnable directement dans le execute de cett factory.
          • Partager sur Facebook
          • Partager sur Twitter
            13 février 2012 à 12:10:18

            merci pour vos réponse, cependant j'ai deja utilisé un boolean que je laisse a true dans ma methode run() ,
            mais quand j'ai une fonction qui passe mon boolean a false, cela kill tous les thread et les poissons... c'est pour ça je pensais aux listes
            j'ai ce genre de chose:

            Runnable r=new Runnable()
            {
                public void run()
                    {
                    while(mon_boolean) { /*instructions*/ }
                    }
            };
            Thread t=new Thread(r);
            t.start();
            
            //plus loin dans les methodes
            public void clear()
            {
            this.monboolean=false;
            }
            

            • Partager sur Facebook
            • Partager sur Twitter
              13 février 2012 à 14:15:31

              Où est déclaré mon_boolean?
              • Partager sur Facebook
              • Partager sur Twitter
                13 février 2012 à 18:23:15

                mon_boolean est declarer plus haut dans le code comme ça:

                boolean mon_boolean=true;


                et donc si je le passe a false dans la fonction clear() , ben tous les animaux sont detruits (tous les thread )
                et moi j'aimerais que ce soit seulement le dernier
                • Partager sur Facebook
                • Partager sur Twitter
                  13 février 2012 à 18:31:52

                  Est-ce que ton boolean est statique?
                  C'est une erreur "bête" mais qui serait tout à fait envisageable.

                  Si oui, c'est normal que tous tes animaux disparaissent. Les x boucles vont toutes vérifier si mon_boolean = true. Si ta variable est statique, Il n'y a qu'un seul et unique boolean pour les x boucles, donc dès qu'il est fixé à false, toutes les boucles ont false en condition.

                  (C'est plutôt mal expliqué, désolé ^^ !)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 février 2012 à 18:52:41

                    je viens de verifier et non, mon boolean n'est pas en static, et d'ailleurs je l'ai mis en static pour voir, et peu importe qu'il soit static ou non, des que je le passe à false, tous les animaux sont detruits...

                    Pourtant c'est surement possible que ce soit juste avec un boolean que je puisse detruire un poisson
                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 février 2012 à 9:25:37

                      Montre toute ta classe alors parce que perso je comprend pas comment tu utiliser mon_boolean alors que tu set monboolean.
                      • Partager sur Facebook
                      • Partager sur Twitter

                      thread

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown