Threads + Producer Consumer

  • Hallo bekomme ein einfaches Producer Consumer Programm nicht zum laufen mit Threads bzw. verhält es sich vollkommen falsch, wäre nett, könnte mir jemand helfen.

    Also es gibt ein Interface ProduceListener:

    public interface ProducerListener {

    public void itemReady(Producer producer);
    public void endOfProduction(Producer producer);

    }

    Dann eine Klasse Producer

    import java.lang.Thread;


    public class Producer extends Thread {

    private String id;
    private int count;
    private int item;
    private ProducerListener listener;

    public Producer(String id, int numberOfItems) {

    this.id = id;
    this.count = numberOfItems;

    }

    public void setProducerListener(ProducerListener listener) {

    this.listener = listener;
    }

    public int pickUpItem() {

    return this.item;
    }

    public String getId() {
    return this.id;
    }

    public void run() {

    int i;
    for (i=1;i<=this.count;i++) {

    /* Niemand darf unseren Produzer jetzt betreten, da dieser das Item produziert*/
    synchronized(this){

    this.item = i;
    /*Consumer aufwecken dass dieser Producer (this) nun fertig ist.*/

    this.listener.itemReady(this);

    try {
    // wait for Producer to put value

    this.wait();


    } catch (InterruptedException e) {

    }
    }
    }

    //this.listener.endOfProduction(this);
    }
    }

    Und ne klasse Konsumer :

    public class Consumer extends Thread implements ProducerListener{


    private Producer myProducer;
    private int itemP;
    private boolean available;

    public Consumer (Producer p1,Producer p2) {

    p1.setProducerListener(this);
    p2.setProducerListener(this);
    this.available = true;
    }

    public void itemReady(Producer producer) {

    this.myProducer = producer;
    this.notify();


    }

    public void endOfProduction(Producer producer){
    //synchronized(this) {
    // this.available =false;
    // this.notify();
    //}
    }

    public void run() {

    while (this.available ==true ) {


    synchronized(this.myProducer){

    try {
    // wait for Producer to put value

    this.myProducer.wait();

    } catch (InterruptedException e) {
    }

    this.itemP = this.myProducer.pickUpItem();


    this.myProducer.notifyAll();

    }
    System.out.println(this.myProducer.getId()+":"+this.itemP);


    }
    }
    }



    Leider funkt das alles gar nicht richtig: der Konsument hat praktisch 2 Produzenten, der Produzent nützt das Interface , um den Konsumenten bescheid zu geben, falls ein item produziert worden ist (ITem = Zahl in diesem Fall)
    Was mache ich da falsch ?

    L.g fips

  • Wenn Consumer zu laufen beginnt, ist myProducer nicht gestzt.
    Was bringen die synchronized(this), wenn's sonst keine synchronized Methoden gibt? Soll das irgendwie das notify() absichern?

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!