[JAVA] aide sr les Thread

kittyhime Messages postés 10 Statut Membre -  
chuka Messages postés 980 Statut Membre -
Bonjour,

Je dois développer une application producteur/consommateur pour illustrer le mécanisme de synchronisation entre threads.

Un thread producteur crée des messages et les place dans une file d'attente.
Un thread consommateur retire un message de la file et l'affiche.

Le producteur et le consommateur ont un débit différents.

Voici mon code (je ne vous copie/colle pas les assesseurs) :

Classe Producteur

public class Producteur extends Thread{
    
    private int messagePro; //nbre de message à produire
    private int message; //nbre de message produit
    private int debit; //debit de production
   
    public Producteur(int m, int d) {
        setMessagePro(m); 
        setDebit(d);
    }
    
    public void run() {
    	for (int i = 1; i <= this.getMessagePro(); i++) {
    		setMessage(this.getMessage()+1);
    		System.out.println("Production du message " + i);
    		try { sleep(this.debit); }
    		catch (InterruptedException e) { }
        }
    }
}


Classe Consommateur

public class Consommateur extends Thread{

    private Producteur p;
    private int debit;
    
    public Consommateur(Producteur p, int d) {
        this.p = p;
        setDebit(d);
    }
    
    public void run() {
        for (int i = 1; i <= this.p.getMessage(); i++) {
        	System.out.println("Consommation du message " + i);
        	try { sleep(this.debit); }
        	catch (InterruptedException e) { }
        }
    }


Classe Main

public class Main {

	public static void main(String[] args) {
			Producteur p = new Producteur(5, 1000);
			p.start();
			Consommateur c = new Consommateur(p, 1000);
			c.start();
	}
}


Resultat à l'écran :

Production du message 1
Consommation du message 1
Production du message 2
Production du message 3
Production du message 4
Production du message 5

Je suppose que mon pb vient du fait que je boucle sur this.p.getMessage() dans la classe Consommateur et qu'a ce moment du programme, il n'y a que le premier message de produit.

J'ai commencé il y a 1h a comprendre comment marchent les Thread alors svp expliquez moi simplement :)
J'attends votre aide! Merci!

KITTY
A voir également:

1 réponse

chuka Messages postés 980 Statut Membre 378
 
Salut,
c'est peut-etre un peu tard, mais tu peux essayer cela:
package chartostring;
import java.lang.*;
import java.lang.Object.*;
import java.util.*;
import java.util.ArrayList;
 class Producteur extends Thread{

    private int messagePro; //nbre de message à produire
    private int message; //nbre de message produit
    private int debit; //debit de production
    private ArrayList ar;
    public static final Object obj=new Object();
    public Producteur(int m, int d,ArrayList ar) {
       messagePro=m;
       debit =d;
       this.ar=ar;
    }
 
    public void run() {
    	for (int i=0;i<messagePro;i++) {

    		System.out.println("Production du message " + i);
                synchronized (obj)
                {
                    ar.add("Production du message " + i);
                }
    		try { sleep(this.debit*1000); }
    		catch (InterruptedException e) { }
        }
    }
}
  class Consommateur extends Thread{

    private Producteur p;
    private int debit;
    private ArrayList ar;
    public Consommateur(Producteur p, int d,ArrayList ar) {
        this.p = p;
        debit=d;
        this.ar=ar;
    }

    public void run() {
        String j="";
        while(p.isAlive() || !ar.isEmpty()) {

                synchronized (Producteur.obj)
                {
                    if (!ar.isEmpty())
                    {
                        j="Consommateur "+(String)ar.get(ar.size()-1);
                        ar.remove(ar.size()-1);
                        System.out.println(j);
                    }
                }

        	try { sleep(this.debit*1000); }
        	catch (InterruptedException e) { }
        }
    }
  }

    /**
     * @param args the command line arguments
     */
  public class Main {
    public static void main(String[] args) throws InterruptedException {
        ArrayList ar=new ArrayList(10);
        Producteur p=new Producteur(20,1,ar);
        Consommateur cons= new Consommateur(p,2, ar) ;
        p.start();
        cons.start();
        p.join();
        cons.join();
        
    }

}

Bon courage!!
@+
0