2016-08-18 10 views
0
class Producer implements Runnable{ //producer job here 
    Vector<Integer> sQueue; 
    public Producer(Vector<Integer> queue) { 
     this.sQueue=queue; 
    } 
    public void run(){ 
     int i=0; 
     try{ 
      synchronized(sQueue){ 
       for(i=0;i<30;i++){ 
        if(sQueue.size()<15){ 
         System.out.println("Producer producing the item:-"+i); 
         sQueue.add(i); 
         sQueue.notifyAll(); 
        } 
        else 
        { sQueue.notifyAll(); 
         sQueue.wait(); 

        } 
       } 
      } 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

} 
class Consumer implements Runnable{ 
    Vector<Integer> sQueue; 
    public Consumer(Vector<Integer> queue) { 
     this.sQueue=queue; 
    } 
    public void run(){ 
     int i=0; 
     try{ 
      synchronized(sQueue){ 
       while(true){ 
        if(sQueue.size()>0){ 
         System.out.println("Consumer is removing the item:-"); 
         int item=sQueue.remove(0); 
         System.out.println(item); 
         sQueue.notifyAll(); 
         Thread.sleep(1000); 
        } 
        else 
        { 
         sQueue.wait(); 
        } 
       } 
      } 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 
public class ProducerConsumerProblem { 
    public static void main(String [] arg){ 
     Vector<Integer> sQueue; 
     sQueue = new Vector<>(15); 
     Producer p=new Producer(sQueue); 
     Consumer c=new Consumer(sQueue); 
     Thread producer=new Thread(p); 
     Thread consumer=new Thread(c); 
     producer.start(); 
     consumer.start(); 
    } 
} 

上記のコードでは、私は、Javaマルチスレッドの助けを借りてプロデューサ消費者の問題をシミュレートしようとしています。私は私が間違っている、生産者スレッドと消費者のスレッドがインターリーブされていない何が起こっているか知らない整数である共有キューとしてSQUEUEを使用しています、ここコードには何が問題なのですか?スレッドがインターリーブしないのはなぜですか?

----------------------------output------------------------ 
Producer producing the item:-0 
Producer producing the item:-1 
Producer producing the item:-2 
Producer producing the item:-3 
Producer producing the item:-4 
Producer producing the item:-5 
Producer producing the item:-6 
Producer producing the item:-7 
Producer producing the item:-8 
Producer producing the item:-9 
Producer producing the item:-10 
Producer producing the item:-11 
Producer producing the item:-12 
Producer producing the item:-13 
Producer producing the item:-14 
Consumer is removing the item:- 
0 
Consumer is removing the item:- 
1 
Consumer is removing the item:- 
2 
Consumer is removing the item:- 
3 
Consumer is removing the item:- 
4 
Consumer is removing the item:- 
5 
Consumer is removing the item:- 
6 
Consumer is removing the item:- 
7 
Consumer is removing the item:- 
8 
Consumer is removing the item:- 
9 
Consumer is removing the item:- 
10 
Consumer is removing the item:- 
11 
Consumer is removing the item:- 
12 
Consumer is removing the item:- 
13 
Consumer is removing the item:- 
14 
Producer producing the item:-16 
Producer producing the item:-17 
Producer producing the item:-18 
Producer producing the item:-19 
Producer producing the item:-20 
Producer producing the item:-21 
Producer producing the item:-22 
Producer producing the item:-23 
Producer producing the item:-24 
Producer producing the item:-25 
Producer producing the item:-26 
Producer producing the item:-27 
Producer producing the item:-28 
Producer producing the item:-29 
Consumer is removing the item:- 
16 
Consumer is removing the item:- 
17 
Consumer is removing the item:- 
18 
Consumer is removing the item:- 
19 
Consumer is removing the item:- 
20 
Consumer is removing the item:- 
21 
Consumer is removing the item:- 
22 
Consumer is removing the item:- 
23 
Consumer is removing the item:- 
24 
Consumer is removing the item:- 
25 
Consumer is removing the item:- 
26 
Consumer is removing the item:- 
27 
Consumer is removing the item:- 
28 
Consumer is removing the item:- 
29 
+0

あなたは正確に何を期待していますか?それは明確ではない –

+0

上記の出力では、消費者スレッドまたはプロデューサスレッドがwait()メソッドによってブロックされるまで、notifyAll()を呼び出した後でもインターリーブされないことがわかりますが、 –

答えて

1

あなたの方法は​​ている私のマシン上で出力されます。 Producerが起動すると、キューのロックが取得され、完了するまで待機しません。 Consumerが起動すると、ロックを取得できるまで待ちます。インターリーブする必要がある場合は、同期させないでください。​​キーワードは具体的にはです。インターリーブを防止します。

+0

が使用していますnotifyAll()は、同期ブロック内のロックを解放するためにそれはない? –

+0

@sakshamjain 'notifyAll()'はロックを解除しません。それはそれを行う 'wait()'です。しかし、あなたの出力を見てください:あなたのプロデューサースレッドは、消費者が動く前に正確に15回ループします。また、プロデューサが 'wait()'を呼び出す前に、プロデューサがキューに入れることを許可するアイテムの数も15です。 –

+0

@sakshamjainだから私は専門家ではなく、これについて間違っているかもしれませんが、notifyAllのJava Docsから: "目覚めたスレッドは、現在のスレッドがこのオブジェクトのロックを放棄するまで続行できません。"私はそれがロックを解除しないことを意味すると信じているだけで、それをチェックインするように指示する - 彼らは目を覚まし、まだロックされていることを確認してから、引き続き待ちます。 –

関連する問題