2016-04-08 8 views
1

Ich versuche, ein Producer-Consumer-Beispiel zu erstellen, das ich von http://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/explicitlocks.html erhalten habe, der Code ist unten. Wenn ich es laufe, läuft es einfach zweimal und scheint zu hängen. Der Code scheint sich zu öffnen und richtig zu signalisieren, weiß jemand, was ich vermisse.Explizite Sperren und Zustandsvariablen Java Producer Consumer

static Thread t1; 
static Thread t2; 


public static void main(String[] args){ 
    Lab2 r1=new Lab2(); 
    Lab2 r2=new Lab2(); 


    t1=new Thread(r1, "producer"); 
    t2= new Thread(r2, "consumer"); 
    //System.out.println("Adding"); 

    t1.start(); 
    t2.start(); 

} 



public int get(int who) { 

    aLock.lock(); 
    System.out.println("locked1"); 

    try { 
     while (available == false) { 

      try { 
       System.out.println("false avail waiting"); 

       condVar.await(); 
       System.out.println("false avail waiting done"); 

      } catch (InterruptedException e) { } 
     } 
     available = false; 
     System.out.println("Consumer " + who + " got: " + 
          contents); 
     condVar.signalAll(); 
    } finally { 
     aLock.unlock(); 
     return contents; 
    } 
} 

public void put(int who, int value) { 


       aLock.lock(); 
       System.out.println("locked"); 

try { 
    while (available == true) { 
     System.out.println("true avail"); 
     try { 
      condVar.await(); 
     } catch (InterruptedException e) { } 
    } 
    contents = value; 
    available = true; 
    System.out.println("Producer " + who + " put: " +contents); 
    condVar.signalAll(); 
    //condVar.signal(); 
    } finally { 
     aLock.unlock(); 

    } 
} 


public void run() { 
    //System.out.println(Thread.currentThread().getName()+" Thread started"); 
    int i=0; 
    //System.out.println("Adding"); 

    while(i<10){ 
     i++; 
     //System.out.println(i); 
     if (Thread.currentThread().getName().equals("producer")){ 
     get(2); 
     //producer(); 
     } 
     else{ 
     put(2,1); 
     //consumer(); 
     } 
     //break; 
    } 
} 
+0

Welche Code sind Sie? Sie haben zwei Methoden veröffentlicht, aber wir haben keine Ahnung, wie Sie sie verwenden. –

+0

Yaroslav, danke. Ich habe es hinzugefügt. – user2997606

Antwort

1

Ihr Problem ist hier:

Lab2 r1=new Lab2(); 
Lab2 r2=new Lab2(); 

t1=new Thread(r1, "producer"); 
t2= new Thread(r2, "consumer"); 

D.h. Sie haben zwei Threads, die unabhängige Runnables (r1, r2) ausführen, aber sie sollten mit demselben Runnable bereitgestellt werden.

Ersetzen Sie es mit:

Lab2 r=new Lab2(); 

t1=new Thread(r, "producer"); 
t2= new Thread(r, "consumer"); 
+0

Danke! Du hast mich mindestens eine Stunde gerettet. – user2997606

Verwandte Themen