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 :

Probleme d'interblocage entre deux Thread


Sujet :

Concurrence et multi-thread Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Probleme d'interblocage entre deux Thread
    Bonjour a tous;
    j'ai fait un petit programme pour mettre en pratqiue l'interblicage entre les Thread, mais ca na pas marché, je vous montre mon programme , si quelqu'un sait ou est le probleme merci de me le signaler
    le programme normalement doit afficher alternativement A B A B A B....

    merci davance

    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
    class Jeu{
     int tour=1;
    		public synchronized void jouer1() {
    		                        if(tour==2){
    		                                   try{ wait();}
    					                        catch(InterruptedException e){}
    		                        }
    		System.out.print("A");
    		 tour=2;
     
    		 notify();
    		 }
           public   synchronized void jouer2() {
    		                        if(tour==1){
    		                                 try{ wait();}
    					                       catch(InterruptedException e2 ){}  
    		                        }
    		 if (tour==2){System.out.print("B");
    		 tour=1;
     
    		 notify();
    		 }
    		 }
    }
    public class Joueur extends Thread {
            char x;
     
    		 Joueur(char x){this.x=x;}
    		 public static void main(String[] args){
    		         Joueur j1= new Joueur('A');
    				 j1.start();
    				 Joueur j2= new Joueur('B');
    				 j2.start();
     
    	     }
    		 public void run(){while(true){
     
    		 if(x=='A'){
                		 new Jeu().jouer1();} 
     
    		 if(x=='B'){
    		           new Jeu().jouer2(); }
    				   }
     
    		 }
    }

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Salut !

    Et bien tu as plusieurs probleme ...

    Tout d'abord tu methodes synchronized jouer1 et jouer2 ... sont par definition en exclusion mutuelle sur l'objet "this" ...

    Or tu les apelle dans tes threads ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    	public void run(){
     
    		while(true){
     
    			if(x=='A'){
    				new Jeu().jouer1();} 
     
    			if(x=='B'){
    				new Jeu().jouer2(); }
    		}
    	}
    il faut les appeler ainsi plutot (pour qu'elle soint synchronisée elle doivent utiliser la même instance (par exemple en static ou en la construisant dans le main)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	static Jeu j = new Jeu() ;
    	public void run(){
     
    		while(true){
     
    			if(x=='A'){
    				j.jouer1();} 
     
    			if(x=='B'){
    				j.jouer2(); }
    		}
    	}
    Ensuite tu verra ton programme fonctionner et afficher un unique 'A' ... explications :
    - L'appel joueur1 se lance... c'est a son tour il affiche 'A' et se met en attente...
    - L'appel joueur2 se lance... or il est synchronisé avec joueur 1 donc tombe en attente que joueur1 libere la place (alors qu'en fait joueur1 est en wait)

    Donc il va encore falloir rendre ton synchronised moins selectif
    exemple (enlever les wait.... un wait dans un synchronized je prefere eviter)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	public synchronized void jouer1() {
    		if (tour == 1) {
    			System.out.println("A") ;
    			tour = 2 ;
    		}
    	}
     
    	public synchronized void jouer2() {
    		if (tour == 2) {
    			System.out.println("B") ;
    			tour = 1 ;
    		}
    	}

    Au final voici tes deux classes (un peu nettoyées)

    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
     
    public class Joueur extends Thread {
    	private char x;
    	private Jeu j ;
     
    	public Joueur(char x, Jeu j){
    		this.x=x;	
    		this.j=j;
    	}
     
    	public static void main(String[] args){
    		Jeu j = new Jeu() ;
    		Joueur j1= new Joueur('A', j);
    		Joueur j2= new Joueur('B', j);
    		j1.start();
    		j2.start();
    	}
     
    	public void run(){
    		while(true){
    			switch (x) {
    				case 'A': j.jouer1(); break ;
    				case 'B': j.jouer2(); break ;
    			} 
    		}
    	}
    }
    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
     
    class Jeu{
     
    	int tour=1;
     
    	public synchronized void jouer1() {
    		if (tour == 1) {
    			System.out.println("A") ;
    			tour = 2 ;
    		}
    	}
     
    	public synchronized void jouer2() {
    		if (tour == 2) {
    			System.out.println("B") ;
    			tour = 1 ;
    		}
    	}
    }
    Voila j'espere avoir pu t'aider !
    K.

Discussions similaires

  1. synchronisation entre deux threads
    Par chabfive dans le forum Concurrence et multi-thread
    Réponses: 9
    Dernier message: 03/11/2006, 12h17
  2. Opération mathématique entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 11
    Dernier message: 13/06/2005, 11h58
  3. Communication entre deux Threads
    Par rvzip64 dans le forum Langage
    Réponses: 13
    Dernier message: 28/01/2005, 09h14
  4. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  5. Réponses: 2
    Dernier message: 25/05/2004, 11h40

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