2016-04-08 10 views
1

http://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/explicitlocks.html'dan temin ettiğim bir üretici tüketici örneği çalıştırmaya çalışıyorum, kod aşağıda. Ben koştuğumda, sadece iki kez çalışır ve asılı gibi görünüyor. Kodun kilitlenmesi ve düzgün bir şekilde işaretlenmesi gibi görünüyor, eksik olanı bilen var mı?Açık Kilitler ve Koşul Değişkenleri Java Üreticisi Tüketici

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

Çalıştırdığınız Ne kod:

ile değiştirin? İki yöntem gönderdiniz, ancak bunları nasıl kullandığınızı bilmiyoruz. –

+0

Yaroslav, teşekkürler. Ekledim – user2997606

cevap

1

Senin sorunun buradadır:

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

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

yani bağımsız runable'ları (r1, r2) çalıştıran iki iş parçacığınız var, ancak bunlar aynı runnable ile sağlanmalıdır.

Lab2 r=new Lab2(); 

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

Teşekkür ederiz! Beni en az bir saat kurtardın. – user2997606