Partage
  • Partager sur Facebook
  • Partager sur Twitter

JAVA Multithreading : synchronize/ wait / notify

Sujet résolu
    20 octobre 2016 à 11:23:35

    Bonjour,

    J'essaie de faire un petit programme multithread en java :

    Je lance plusieurs threads (ici deux) qui comptent de 1 à 10, puis attendent que les autres ont fini de compter jusque 10 pour compter de 10 à 20.
    En théorie il faut donc qu'une fois qu'un thread est arrivé à 10 il vérifie si les autres ont fini:
    _ Si oui il les réveils (avec notifyAll() ?)
    _ Sinon il les attend (avec wait() ?)

    Mais voilà je pense que je n'ai pas bien compris comment utiliser wait() notify() et synchronize.

    Voici mon code et merci pour votre aide :) 

    ( Je ne pense pas que le main soit bien utile je ne fait que créer deux objets de classe "Test" et appeler le run() de chacun des deux)

    class Test extends Thread {
    	
    	static int count = 0;
    	   
    	public void run(){
    		   int i = 0;
    		   synchronized(this){
    		   for (; i < 10;) {
    	         System.out.println(Thread.currentThread().getName() + " - " + (++i));
    		   }
    		   
    		   System.out.println(count);
    		   
    		   if (count == 0){
    			   ++count;
    		   
    			   try {
    				wait();
    			   } catch (InterruptedException e) {
    				e.printStackTrace();
    			   }
    		   }
    		   else{
    			   notifyAll();
    		   }
    		   
    		   for (; i < 20;) {
    		         System.out.println(Thread.currentThread().getName() + " - " + (++i));
    		   }
    		   }
    	   }
    	}



    -
    Edité par RafReynoird 20 octobre 2016 à 11:24:10

    • Partager sur Facebook
    • Partager sur Twitter
      20 octobre 2016 à 17:01:08

      Hello,

      il me semble que ce genre d'opération est faite à l'aide d'un CountDownLatch

      • Partager sur Facebook
      • Partager sur Twitter
        25 octobre 2016 à 10:53:12

        C est bon j'ai résolu mon problème en utilisant une classe "Sentinelle" : 

        public class Sentinelle {
        	private int count =0;
        	public void incCount(){
        		++count; 
        	}
        	public int getCount(){
        		return count;
        	}
        }
        
        

        Le code de ma classe Test change surtout au niveau du synchronized :

        class Test extends Thread {
        	
        	private Sentinelle s;
        	
        	public Test(Sentinelle sen){
        		s =sen;
        	}
        	   
        	public void run(){
        		   int i = 0;
        		   
        		   for (; i < 10;) {
        	         System.out.println(Thread.currentThread().getName() + " - " + (++i));
        		   }
        		   
        		  
        		   
        		   
        		   synchronized(s){
        			   s.incCount();
        			  
        			   System.out.println(s.getCount());
        		   
        		   
        		   if (s.getCount() < 3){
        		   try {
        				s.wait();
        		   }
        		   catch (InterruptedException e) {
        				// TODO Auto-generated catch block
        				e.printStackTrace();
        		   }
        		   }
        		   else{
        			   s.notifyAll();
        		   }
        		   }
        		   for (; i < 20;) {
        		         System.out.println(Thread.currentThread().getName() + " - " + (++i));
        		   
        		   }
        	   }
        	}

        Merci ukusan pour ton aide ;)


        • Partager sur Facebook
        • Partager sur Twitter
          25 octobre 2016 à 10:56:23

          Je pense que tu viens de réécrire le fonctionnement du CountDownLatch mais ça reste très formateur

          • Partager sur Facebook
          • Partager sur Twitter

          JAVA Multithreading : synchronize/ wait / notify

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown