2016-04-08 14 views
1

http://www.math.uni-hamburg.de/doc/java/tutorial/essential/threads/explicitlocks.htmlから取得したプロデューサコンシューマの例を実行しようとしていますが、コードは以下のとおりです。私はそれを実行すると、それはちょうど2回実行され、ぶら下がっているようです。コードは、ロックを解除し、適切に信号を送るようだ、誰かが私が行方不明を知っている。明示的ロックと条件変数Javaプロデューサコンシューマ

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

あなたはどのようなコードを実行していますか?あなたは2つの方法を投稿しましたが、どのように使用するかわかりません。 –

+0

ヤロスラフ、ありがとう。私はそれを加えた。 – user2997606

答えて

1

あなたの問題はここにある:

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

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

すなわち、独立した実行可能ファイル(r1、r2)を実行する2つのスレッドがありますが、同じ実行可能ファイルが提供される必要があります。

はに交換してください:

Lab2 r=new Lab2(); 

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

ありがとう!あなたは少なくとも1時間私を救った。 – user2997606