IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Concurrence et multi-thread Java Discussion :

[Thread] Reveiller un thread a partir d'un autre thread d'une autre classe


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut [Thread] Reveiller un thread a partir d'un autre thread d'une autre classe
    bonjour,
    etant en train de developper un pacman en java, je me dois de creer des fantomes.Ces fantomes utilisent trois thread chacun.
    - Un qui recherche le pacman
    - Un qui le fait fuir devant le pacman
    - Un dernier qui va lui faire rentrer a la maison des fantomes si jamais il se fait bouffer.

    Le tout geré par un mecanisme de verrou.

    J'ai donc une classe gestionfantome qui derive de thread dans laquelle les fonctions de deplacement des fantomes sont stockées.
    De cette classe 3 classes dérivent, a savoir les classes de gestion des etats du fantomes (expliqué o dessus).

    Lorsque le pacman mange une superpastille, le thread qui a la main doit alors changer. Pour cela, j'ai une fonction touchelistener qui marche bien.

    Mon Probleme :

    Je n'arrive pa a reveiller le thread contenu dans la classe de fuite du fantome a partir de celui contenu dans la classe qui traque le pacman. Pour la comprehension quelque ligne de code :

    Voici dans ma classe de traque la fonction qui appelle le fonction qui devrait faire reveiller le thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	public synchronized void testInvincibilitePacman()
    	{
    		if (cadre.lab.pacman.isInvincible())
    		{
    			f.setDroit(1);
    			cadre.lab.vulFantome2.releve();
    			//System.out.println("on reveille le thread de vulnerabilité");
    		}
    	}
    setDroit permet de passer le verrou au thread de fuite

    Voici dans ma classe de fuite la fonction qui devrait faire reveiller le thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	public synchronized void releve()
    	{
    		notifyAll();
    	}
    Voila mon probleme, que celui qui m'aide soit beni des dieux lol
    Si vous avez des questions n'hesitez pas...Je ne sais plus koi faire...
    merci d'avance

  2. #2
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Es-tu sur que wait() et notifyAll() sont appelés sur le même objet ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    ouaou rapide...
    ben en fait, ca depen de quel wait et de quel notify tu parle...

    au depart du programme....
    les deux thread (traque et fuite) sont lancé...

    les deux threads testent si ils ont la main par ce type de code...Ya a peu pres le meme dans chaque thread.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (f.getDroit() != num)
    				{
    					System.out.println("le thread n'a pas les droits et s'endort: " + f.getDroit());
    					wait();
    				}
    else
    ....le thread fait ce qu'il a a faire...
    num = c une constante differente donné a chaque thread pour voir si il a les droits ou pas

    ensuite le fantome bouge jusqua ce que pacman mange une superpastille. A ce moment la, le premier code que g donné au dessus se lance. Ce code change les droits. Du coup , la traque au pacman s'arrete correctement. Cepandant, c'est la fuite du fantome qui ne se lance pas..A partir de la classe du thread de traque, je dois reveiller le thread de fuite.

    J'ai essayé en faisant un notifyAll directement depuis la classe de traque, ce qui ne marche pas, vu qu'il ne l'appelle pas sur le thread de fuite, enfin je crois ( lol ).

    J'ai essayé aussi de faire l'appel a un notifyAll contenu dans la classe du thread de fuite ( le code que j'ai donné au precedent post), qui ne marche pas.Je ne sais pa pourquoi. A priori, étant donné qu'il est dans la classe de fuite, ca devrait l'appeler sur le bon objet...

    Maintenant, les threads ce n'est pas mon truc, donc si un genie passe par la...

  4. #4
    FFF
    FFF est déconnecté
    Membre éclairé Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Par défaut
    - Un qui recherche le pacman
    - Un qui le fait fuir devant le pacman
    - Un dernier qui va lui faire rentrer a la maison des fantomes si jamais il se fait bouffer.
    Si je comprends bien le principe du jeu, il me semble que tout cela peut être regroupé dans un même thread contenant des if les uns à la suite des autres ce qui pourrait arranger ton problème...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    Oui cela pourrait arranger mon probleme, c'est d'ailleurs comme cela que j'avais commencé mon projet...Seulement c mon prof qui veut que l'on utilise obligatoirement 3 threads géré par un mecanisme de verrou...Ca fait trois semaines que je suis dessus...Au debut je suis parti comm une bombe, et la ca fé deux semaine que je suis bloqué par ces threads que j'ai baucoup de mal a utiliser....
    Donc , j'aimerai bien n'utiliser qu'un thread, mais le sujet exige qu'on en crée trois...

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Hello,

    Donc , j'aimerai bien n'utiliser qu'un thread, mais le sujet exige qu'on en crée trois... Confused
    oui, mais 3 threads par fantôme ? c'est là que c'est bizarre.... moi je ferais plutôt 1 thread par fantome, 1 thread pour le pacman, 1 thread de réaffichage, ....

    Mais un fantôme, pour moi, ça ressemble plus à un automate à (3) états:

    1) soit il chasse (état initial)
    2) soit il fuit
    3) soit il coucouche-panier... (état final)

    Je ne vois pas l'intérêt d'utiliser des threads pour mélanger ces états...

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    ben je suis desolé mais ce n'est pas moi qui ai ecrit le sujet...Je pense plutot que comme on a pas vraiment utilisé de threads pendant les TP, le prof nous fait faire des fantomes a 3 threads....

    Maintenant c pas impossible de faire un fantome avec 3 threads...C'est gerable...Mon probleme c juste que je n'arrive pas a reveiller le thread de fuite...J'ai cherché toute la journée des cours,exemple et autre code sur le net qui pourrait m'aider, mais tous les exemples que j'ai trouvé de progs multithreadés était géré dans une seule classe...ce qui n'est pa mon cas...Je pense que mon probleme ca doit etre les appels de notify sur les bons objets...mais ca fait trois plombes que je cherche dans le noir...et ca commence serieusement a me .....

    Si quelqu'un a une idee qui pourrait m'aider, ce serait cool....

  8. #8
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Citation Envoyé par arnolpourri
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if (f.getDroit() != num)
    				{
    					System.out.println("le thread n'a pas les droits et s'endort: " + f.getDroit());
    					wait();
    				}
    else
    ....le thread fait ce qu'il a a faire...
    C'est bien dans un bloc synchronizé ça ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    oé c dans des blocs synchronizé appelé par run()

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    mais personne n'aurait une idée de comment reveillé le thread a partir du thread qui a la main , cad le thread de traque ( en utilisant notifyAll()), en étant sur de faire l'appel sur le bon objet, contenu dans la classe de fuite ???

    Olala c'est pas super facile a expiquer, j'espere qe vous comprenez au moins ce que j'essaie de vous expliquer...

  11. #11
    Membre éprouvé Avatar de Satch
    Homme Profil pro
    Hypnothérapeute - Magicien
    Inscrit en
    Mars 2004
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Hypnothérapeute - Magicien

    Informations forums :
    Inscription : Mars 2004
    Messages : 498
    Par défaut
    Bizarre.

    Ton truc se passe comme si le notifyAll n'était pas appelé sur le même objet sur lequel on a appelé le wait.

    Tu devrais juste ptet vérifier en debug ce truc là.

    Faut dire c'est pas évident d'imaginer ce qui peut se passer vu que ton truc c'est pas un truc de 10 lignes et qu'on n'a que des bribes.

    bon courage, je dois filer :p

    Edit : j'avais fait une faute qui me rendait incompréhensible, corrigée.

  12. #12
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    question: l'utilisation de wait/notify/notifyAll est-elle imposée ??

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    eh bien en fait non...

    Mais le pacman va gerer 5 fantomes par niveau, soit 15 threads qui tournerait en permanance, PLUS 1 thread qui va verifier en permanance les collisions pacman-fantome PLUS encore d'autres threads....
    Ce qui me fait au total 17-18 de threads indépendants qui tournerait sur le prog...
    Et dieu sait que JAVA est un langage au combien rapide...

    Alors que si on utilise wait et notify, on peut mettre en sommeil 10 threads sur les 15, vu que a chaque fois, un seul aura les droits pour s'executer...
    Ainsi au total, j'aurai 7 - 8 thread qui tourneront en permanence, ce qui est deja très beaucoup pour java...

  14. #14
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    peut-on voir le code (seulement l'essentiel) du run?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    no prob man

    voila le run du thread de traque

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    public void run()
    	{
    		while (!finPartie)
    		{
    			try
    			{
    				if (f.getDroit() != num)
    				{
    					System.out.println("traque n'a pas les droits et s'endort: " + f.getDroit());
    					dort();
    				}
    				else
    				{
    					System.out.println("traque  a les droits et continue: " + f.getDroit());
    					deplacementFantome();
    					sleep(3000);
    					testInvincibilitePacman();
    				}
    			}
    			catch (Exception e)
    			{
    			System.out.println("Probleme de deplacement : " +e);
    			}
    		}
    	}
     
    public synchronized void testInvincibilitePacman()
    	{
    		if (cadre.lab.pacman.isInvincible())
    		{
    			f.setDroit(1);
    			cadre.lab.vulFantome2.releve();
    			//System.out.println("on reveille le thread de fuite ");
    		}
    	}
    et maintenant une partie de la classe du thread de fuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    public void run()
    	{
    		try
    		{
    			attente();
    		}
    		catch (Exception e)
    		{
    		System.out.println("Probleme d'attente : " +e);
    		}
    	}
     
    	public synchronized void attente() throws InterruptedException
    	{
    		if (f.getDroit() != num)
    		{
    			System.out.println("fuite  n'a pas les droits et s'endort: " + f.getDroit());
    			dort();
    		}
    		else
    		{
    			System.out.println("fuite a les droits et continue: " + f.getDroit());
    		}
    	}
     
    	public synchronized void releve()
    	{
    		notifyAll();
    	}
    cette partie ne fait rien encore...vu que le thread ne se reveillle pas.
    voila, maintenant je vous met quand meme une partie de la console a l'execution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Début de partie
    traque  a les droits et continue: 0
    fuite n'a pas les droits et s'endort: 0
    traque  a les droits et continue: 0
    traque  a les droits et continue: 0
    traque  a les droits et continue: 0
    traque  a les droits et continue: 0
    Le pacman a mangé une superpastille
    traque  n'a pas les droits et s'endort: 1
    voila...a votre service...en gros c ca...si je trouve quelque chose a rajouter, ben jle mettrai

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    quelque petite choses :

    - la fonction dort appele en fait wait()...je c pa pourquoi j'ai fait ca...lol
    - Dans la console, il ne se passe plus rien apres...interblocage, vu que le thread qui devait prendre la main ne s'est pas reveillé...

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 87
    Par défaut
    bonjour,

    bon ben je vois que personne n'a trouvé quelque chose....je vous remercie quand meme...
    Si toutefois quelqu'un aurait une idée de genie, ben hésitez pa a la poster lol..

    Tcho

  18. #18
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    le gros problème lorsque tu utilise wait/notify, c'est que tu n'as pas le contrôle des threads qui sont réveillés par le notify (la JVM choisi un thread au hasard parmis ceux qui étaient en attente). C'est d'ailleurs pour ça qu'il y a notifyAll, pour pouvoir tous les réveiller.

    Mais si tu ajoute un mode pause à tes threads, ça deviendra plus facile à gérer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    class ThreadFuite implements Runnable {
      private final Thread thread;
      private boolean pause = false;
     
      ThreadFuite(){
        super();
        thread = new Thread(this);
        thread.start();
      }
     
      void pause() {
        this.pause = true;
      }
     
      void resume() {
        this.pause = false;
      }
     
      public void run() {
        while(true) {
          synchronized(this) {
            if(! pause) {
              // do work
            }
          }
     
          try { Thread.sleep(10); } catch(InterruptedException e) {}
        }
      }
    }
    c'est un début d'idée, mais tu devrais pouvoir gérer plus facilement les démarrages / mise en attente des threads comme cela


  19. #19
    Membre confirmé Avatar de ikeaboy
    Inscrit en
    Novembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Novembre 2004
    Messages : 114
    Par défaut
    Et finalement ca a donnée quoi? tu as resolu ton problème comment?

Discussions similaires

  1. [XL-2007] Remplissage d'un tableau à partir d'une autre feuille selon une condition
    Par Mackinlay dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/03/2013, 10h50
  2. Réponses: 4
    Dernier message: 22/02/2012, 14h10
  3. Réponses: 3
    Dernier message: 26/12/2010, 22h04
  4. Réponses: 5
    Dernier message: 24/02/2009, 09h05
  5. Réponses: 2
    Dernier message: 07/07/2008, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo