2017-08-08 20 views
-2
public class Queue { 
    int value = 0; 
    boolean isEmpty = true; 
    public synchronized void put(int n){ 
     if (!isEmpty){ 
      try { 
       System.out.println("producer is waiting"); 
       wait(); 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 
     value += n; 
     isEmpty = false; 
     System.out.println("The number of products:"+value); 
     notifyAll(); 
    } 
    public synchronized void get(){ 
     if (isEmpty){ 
      try{ 
       System.out.println("customer is waiting"); 
       wait(); 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 
     value --; 
     if(value<1){ 
      isEmpty = true; 
     } 
     System.out.println("there are "+value+" left"); 
     notifyAll(); 
    } 
} 


public class Producer extends Thread{ 
    private Queue queue; 
    public Producer(String name,Queue queue){ 
     super(name); 
     this.queue = queue; 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i < 5; i++) { 
      queue.put(i+1); 
     } 
    } 

} 

public class Producer extends Thread{ 
    private Queue queue; 
    public Producer(String name,Queue queue){ 
     super(name); 
     this.queue = queue; 
    } 

    @Override 
    public void run() { 
     for (int i = 0; i < 5; i++) { 
      queue.put(i+1); 
     } 
    } 
} 


public class Main { 

    public static void main(String[] args) { 
     Queue queue = new Queue(); 
     Thread customer1 = new Customer("customer1",queue); 
     Thread producer1 = new Producer("producer1",queue); 
     customer1.setPriority(4); 
     producer1.setPriority(7); 
     producer1.start(); 
     customer1.start(); 

    } 

} 

出力:Javaの消費者/プロデューサー

 
The number of products:1  
producer is waiting  
there are 0left  
customer is waiting  
The number of products:2  
producer is waiting  
there are 1left  
there are 0left  
customer is waiting  
The number of products:3  
producer is waiting  
there are 2left  
there are 1left  
there are 0left  
customer is waiting 
The number of products:4  
producer is waiting  
there are 3left  
there are 2left  
there are 1left  
there are 0left  
customer is waiting  
The number of products:5  
there are 4left  
there are 3left  
there are 2left  
there are 1left  
there are 0left  
customer is waiting 

出力の順序は次のようにしている理由を私は知りません。

なぜそれが、私は、問題は、あなたが通知さbeeingて後にあなたの状態をチェックしませんということだと思います

 
The number of products:3 
producer is waiting  
there are 2left  
The number of products: 6  
there are 5left    
The number of products: 10  
there are 9left  
The number of products: 15   
there are 14left 
+0

をなぜあなたはそれをマルチスレッドする必要がありますか? – Professor901

+0

私はちょうどそれがこのように動作しない理由を知りたいです。 –

+0

プロセスの同期は保証されていません。 –

答えて

0

のような出力結果をしません。

あなたがやる

if (condition){ 
    wait(); 
} 
increment(); 

あなたのスレッドが別のコンテキストから通知を受けることができますが条件がまだ存在するか、別のスレッドによって解決されていて、とにかく増分をすれば、それは、チェックしません。正しい 、のようなものウェイクアップ時に自分の状態を再確認するために、次のようになります。

while (condition){ 
    wait(); 
} 
increment(); 
関連する問題