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

avec Java Discussion :

Problème avec Thread et NotifyAll()


Sujet :

avec Java

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème avec Thread et NotifyAll()
    Bonjour,
    Je n'arrive pas à trouver pourquoi, ma méthode wake(), ne réveille pas la méthode wait(). Le réveille s'effectue seulement au bout du délai fixé dans wait(delai). Quelqu'un aurait il une solution svp?

    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
    37
    38
    39
    40
    41
    42
    43
     
    public class ThreadPartie extends Thread {
    	Partie p;
    	long delai;
     
    	public ThreadPartie(Partie p, long delai) {
    		this.p = p;
    		this.delai = delai;
    	}
     
    	public synchronized void wake(){
     
                this.notify();
     
    	}
     
    	public synchronized void run() {
    		try {
    			// pause
     
    			wait(delai);
     
    		} catch (InterruptedException ex) { 
    		}
    		System.out.println("fin");
    		}
    	}
    }
     
    public class Principale {
     
    	public static void main(String[] args) {
     
    		Dictionnaire d = new Dictionnaire("dictionnaire");
    		Partie p = new Partie(d,0,200000,1);
     
                    ThreadPartie t = new ThreadPartie(p,10000);
                    t.start();
                    t.wake();
     
    	}
     
    }

  2. #2
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    C'est un simple problème d'ordonnancement des tâches.
    Lorsque tu fais le "t.start", le Thread t démarre mais il n'a pas le temps d'arriver à l'instruction "wait" que le "t.wake" est exécuté.
    Et seulement ensuite le "wait" est exécuté. Tu lui demande donc de se réveiller avant même qu'il s'endorme.
    Ajoute une simple pause de 1 seconde (Thread.sleep( 1000 )) entre le "start" et le "wake" pour résoudre ton problème.
    Par contre, il faut synchroniser l'appel à "wait" dans ton Thread.

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci beaucoup pour ta réponse. J'avais déjà passé pas mal de temps sur ce problème...

    En effet l'ajout d'un sleep me permet d'avoir le résultat escompté, cependant jusqu'à quel point, peut on diminuer la durée de sleep sans arriver à cette erreur? Il y a-t-il un moyen plus propre d'arriver au résultat, sans utiliser sleep? Par exemple en donnant une priorité maximale à t, celle-ci garantira-t-elle l'éxécution de t jusqu'à wait ?

    Concernant ma méthode wait, le synchronized de la méthode run ne suffit-il pas?

    Encore merci

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Points : 7 163
    Points
    7 163
    Par défaut
    Citation Envoyé par Florianter Voir le message
    Il y a-t-il un moyen plus propre d'arriver au résultat, sans utiliser sleep?
    Effectivement, le sleep est très moche. C'était uniquement pour te faire comprendre le phénomène. Le plus simple dans ton cas est d'ajouter un booléen pour la gestion de la pause. C'est très bien expliqué par monsieur Sun.
    Voici ce que pourrait donner ton code :
    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
    37
    public class ThreadPartie extends Thread
    {
    	private long delai;
    	private boolean threadPause = true;
     
    	public ThreadPartie( long delai )
    	{
    		this.delai = delai;
    	}
     
    	public synchronized void wake()
    	{
    		threadPause = false;
    		this.notify();
    	}
     
    	public synchronized void run()
    	{
    		if( threadPause )
    		{
    			try
    			{
    				wait( delai );
    			}
    			catch( InterruptedException ex ) {}
    		}
     
    		System.out.println( "fin" );
    	}
     
    	public static void main( String[] args )
    	{
    		ThreadPartie t = new ThreadPartie( 10000 );
    		t.start();
    		t.wake();
    	}
    }
    Et oublie ma recommandation sur la synchronization du "wait", je n'avais pas vu que la méthode run était synchronisée

  5. #5
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci, c'est parfait !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec thread
    Par remy8957 dans le forum Général Python
    Réponses: 4
    Dernier message: 15/09/2009, 09h57
  2. Problème avec threads après mise à jour
    Par issoram dans le forum Modules
    Réponses: 2
    Dernier message: 20/05/2009, 12h18
  3. Probléme avec Thread
    Par infoelectronique dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 06/10/2008, 14h48
  4. Problème avec Thread
    Par demcoul dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 16/03/2007, 11h53
  5. Problème avec Thread
    Par halic dans le forum C#
    Réponses: 2
    Dernier message: 08/02/2007, 14h15

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