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 :

[Applet+Threads] Pause et resume qui fonctionne pas


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut [Applet+Threads] Pause et resume qui fonctionne pas
    Salut à tous,

    Je voudrais réaliser une application basique avec 2 threads: 1 producteur, 1 consommateur.
    Je lance le producteur avec un bouton Start, idem pour le consommateur.
    Et j'ai un bouton Pause pour chacun.

    Sans utiliser les boutons pause, ca marche nikel. Dés que je touche un bouton pause ca plante: dans la console ca marche tjrs jusqu'a la fin du programme mais sur l'applet je peux plus rien toucher et ca plante méchant.

    Voici la partie de mon applet qui s'ocuppe des boutons:
    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
    44
    45
    46
    public synchronized void actionPerformed(ActionEvent event) {
    		Object source = event.getSource();
     
    		if      (source == b_startCustomer)    {
    			System.out.println("b1");
    			newArrival.start();
    		}
    		else if (source == b_pauseCustomer)  {
    			System.out.println("b2");
    			try {
    				if (arrivalsPaused==false){
    					newArrival.pauseArrivals();
    					arrivalsPaused=true;
    				}else{
    					newArrival.resumeArrivals();
    					arrivalsPaused=false;
    				}
     
    			} catch (InterruptedException e) {
    				// TODO Bloc catch auto-généré
    				e.printStackTrace();
    			}
    		}
    		else if (source == b_startTill) {
    			System.out.println("b3");
    			newDepartures.start();
    		}
    		else if (source == b_pauseTill) {
    			System.out.println("b4");
    			try {
    				if (departuresPaused==false){
    					newDepartures.pauseDepartures();
    					departuresPaused=true;
    				}else{
    					newDepartures.resumeDepartures();
    					departuresPaused=false;
    				}
     
    			} catch (InterruptedException e) {
    				// TODO Bloc catch auto-généré
    				e.printStackTrace();
    			}
    		};
     
    		repaint();
    	  }
    Voici la partie s'occupe de la pause et resume dans le producteur (c pareil pour le consommateur):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public synchronized void pauseArrivals() throws InterruptedException{
    		wait();
    	}
     
    	public synchronized void resumeArrivals(){
    		notify();
    	}

  2. #2
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut
    Aucune idée?!
    Mon code parait-il bon ?

  3. #3
    Membre chevronné
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Points : 2 011
    Points
    2 011
    Par défaut
    Si j'ai bien compris ton code tu procède ainsi :

    - pour la pause: appel de la méthode wait du thread que tu veux mettre en pause.

    -pour le resume: appel de la méthode notify du même thread soit celui que tu veux réveiller.

    Si c'est bien ça alors on est en face d'un problème...

    Un thread endormi par un wait ne peux se réveiller lui-même en appelant notify. C'est à un autre thread non endormi d'appeler le notify de manière à pouvoir réveiller le thread endormi.

    J'espère que je suis clair...

    -"Tout ça me paraît très mal organisé. Je veux déposer une réclamation. Je paye mes impôts, après tout!"
    -"JE SUIS LA MORT, PAS LES IMPÔTS! MOI, JE N'ARRIVE QU'UNE FOIS".

    Pieds d'argile (1996), Terry Pratchett 1948 - 2015
    (trad. Patrick Couton)

  4. #4
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Moi je trouve ca bizarre que ca marche en mode console :
    - tu crées tes threads, tout va bien.
    - lors de l'appel des méthodes pause(), c'est le thread graphique qui fait le wait(). Normalement, ton interface graphique devrait se figer.

    Ton programme doit etre construit ainsi :
    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
    public void actionPreformed(ActionEvent e) {
     
      if(event.getSource().equals(b_start))
        monthread.start();
      else if(event.getSource().equals(b_pause))
        monthread.triggerPause();
    }
     
    Class MonThread extends Thread {
     
      private boolean paused = false;
     
      public void run() {
        while(true) {
          synchronized(this) {
            while(paused) {
              try {this.wait(); } //catch ...
            }
          }
          // le reste du run ...
        }
      }
     
      public void triggerPause() {
        synchronized(this) {
          paused = !paused;
          if(!paused)
            this.notify();
        }
      }
    }
    Comme ca, le thread graphique indique a monthread qu'il doit s'arreter en appelant triggerPause, c'est monthread qui appelle wait() sur lui meme, et c'est le thread graphique qui appelle notify() sur le meme objet.
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2004
    Messages : 190
    Points : 88
    Points
    88
    Par défaut
    Je comprend ce que vous voulez m'expliquer: si un thread est endormie, il peut pas se reveiller tout seul. Par contre il peut s'endormir tout seul.

    Mais en lisant ton code xavlours j'ai du mal à voir une différence avec ce que j'avais ecrit: pour le notify() c'est une méthode comme mon resume...() qui fait un le notify() sur this. Et pour le wait() il est appelé indirectement et dans le run() mais ca reste this (le thread lui même) qui lance le wait() non??!

    Bref, même si je l'ai pas tout à fait compris, ton code marche nikel!

    Merci.

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

Discussions similaires

  1. [PHP-JS] foreach qui fonctionne pas
    Par tiger63 dans le forum Langage
    Réponses: 4
    Dernier message: 06/04/2007, 15h49
  2. [Mail] fonction mail qui fonctionne pas
    Par digger dans le forum Langage
    Réponses: 3
    Dernier message: 31/08/2006, 22h28
  3. [Conception] Deux codes identique mais un qui fonctionne pas
    Par fabrice88 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 01/08/2006, 17h25
  4. fonction ridicule qui fonctionne pas sous firefox
    Par Isses dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 27/06/2006, 12h08
  5. fonction plpgsql qui fonctionne pas...
    Par Empty_body dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/01/2006, 18h22

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