2017-08-08 149 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 

我不知道爲什麼的輸出順序是這樣的。

爲什麼它不在輸出像

 
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

的結果,我認爲這個問題是你不beeing通知後,請檢查你的病情。

你做

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

雖然你的線程可能會在別的方面得到通知,也不會檢查,如果條件仍然存在,或由另一個線程已經解決,做增量反正。 正確的方法是在喚醒時重新檢查您的狀況,如:

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