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

Langage Java Discussion :

A propos de wait(), notify() et notifyAll


Sujet :

Langage Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Points : 151
    Points
    151
    Par défaut A propos de wait(), notify() et notifyAll
    Bonjour,

    Je commence par joindre les exemples et explique après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Station {
    	public synchronized void attendreBus() throws InterruptedException {
    		wait();
    	}
     
    	public synchronized void chargerUsagers() {
    		notifyAll();
    	}
    }
    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
     
    class Usager extends Thread {
    	private String nom;
     
    	private Station s;
     
    	private int heureArrivee;
     
    	public Usager(String nom, Station s, int heureArrivee) {
    		this.nom = nom;
    		this.s = s;
    		this.heureArrivee = heureArrivee;
    	}
     
    	public void run() {
    		try {
    			sleep(heureArrivee);
    			System.out.println(nom + " arrive a la station");
    			s.attendreBus();
    			System.out.println(nom + " est monte dans le bus");
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    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
    class Bus extends Thread {
    	private Station s;
     
    	private int heureArrivee;
     
    	public Bus(Station s, int heureArrivee) {
    		this.s = s;
    		this.heureArrivee = heureArrivee;
    	}
     
    	public void run() {
    		try {
    			sleep(heureArrivee);
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		System.out.println("Bus arrive a la station");
    		s.chargerUsagers();
    		System.out.println("Bus repart de la station");
    	}
     
    	public static void main(String args[]) {
    		Station Gare = new Station();
    		Bus b7 = new Bus(Gare, 2000);
    		Usager u[] = { new Usager("Philippe", Gare, 1500),
    				new Usager("Patricia", Gare, 3000),
    				new Usager("Yves", Gare, 1000),
    				new Usager("Mireille", Gare, 1000) };
     
    		b7.start();
     
    		for (int i = 0; i < u.length; i++)
    			u[i].start();
    	}
     
    }
    1- Première question sur le fonctionnement de notify()
    notify prévient a une thread en attente (wait()) qu'elle peut continuer son traitement. Mais, cas de plusieurs thread en attente lequel démarre? Est-ce un au hasard ou le premier arrivé? ou est ce qu'il existe un mecanisme qui permets de lancer une thread spécifique?

    J'ai un peu du mal a comprendre ce mécanisme.

    2- Dans les exemples plus hauts, dans la classe Station, attendreBus et changerUsager sont des méthodes synchronised. Enlever synchronised envoi une exception IllegalMonitorStateException , pourquoi cela?

    3- Et enfin pourquoi un simple appel de wait dans la classe Usager renvoi l'exception IllegalMonitorStateException

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    1) au hasard

    2 et 3) il faut avoir le verrou sur l'objet en question avant de faire un wait/notify/notifyAll dessus, c'est indiqué dans la javadoc.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 173
    Points : 151
    Points
    151
    Par défaut
    Merci, c'est ce que je viens de voir sur l'API.

    J'aurai du faire ca avant

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

Discussions similaires

  1. wait() , notify() et notifyAll()
    Par nolofinwe dans le forum Langage
    Réponses: 5
    Dernier message: 12/04/2010, 10h38
  2. Problème Thread wait / Notify
    Par tiamat dans le forum Concurrence et multi-thread
    Réponses: 17
    Dernier message: 28/05/2009, 12h24
  3. [Thread] Probleme sur wait() / notify()
    Par Jean_pierre dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 30/11/2008, 09h31
  4. synchronisation wait notify
    Par storm_2000 dans le forum Langage
    Réponses: 4
    Dernier message: 23/10/2008, 23h19
  5. Synchronize, wait, notify etc...
    Par jeje99 dans le forum Langage
    Réponses: 4
    Dernier message: 06/01/2006, 11h46

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