1. 程式人生 > >JAVA執行緒(生產者與消費者)

JAVA執行緒(生產者與消費者)

業務需求: 
    生產20個饅頭,籃子裡只能放6個饅頭。 
    消費者發現籃子裡有饅頭可以食用時即可把饅頭取出開始使用,直到籃子裡饅頭為空。 
    生產者發現籃子裡的饅頭不滿足6個時,生產者開始生產饅頭並放入籃子中。 

具體實現: 

第一步:建立盛放饅頭的籃子類 

Java程式碼  收藏程式碼
  1. publicclass SyncBasket {  
  2.     public Bread[] breads = new Bread[6];  
  3.     privateint index = 0;  
  4.     publicsynchronizedvoid push(Bread bread ) {  
  5.         while(index==this.breads.length){  
  6.             try{  
  7.                 this.wait();  
  8.             }catch(InterruptedException e){  
  9.                 e.printStackTrace();  
  10.             }     
  11.         }  
  12.         this.notifyAll();  
  13.         breads[index]=bread;  
  14.         index++;  
  15.     }  
  16.     public
    synchronized Bread pop() {  
  17.         while(index==0){  
  18.             try{  
  19.                 this.wait();  
  20.             }catch(InterruptedException e){  
  21.                 e.printStackTrace();  
  22.             }  
  23.         }  
  24.         this.notifyAll();  
  25.         index--;  
  26.         return breads[index];  
  27.     }  
  28. }  


第二步:建立生產者類 
Java程式碼  收藏程式碼
  1. publicclass Producer implements Runnable {  
  2.     private SyncBasket basket;  
  3.     public Producer(SyncBasket basket) {  
  4.         this.basket = basket;  
  5.     }  
  6.     publicvoid run() {  
  7.         for(int i=1;i<21;i++){  
  8.             Bread bread = new Bread(i);  
  9.             basket.push(bread);  
  10.             System.out.println("producer produce: " + bread);  
  11.             try {  
  12.                 Thread.sleep((int) (Math.random() * 1000));  
  13.             } catch (InterruptedException e) {  
  14.                 e.printStackTrace();  
  15.             }  
  16.         }  
  17.     }  
  18. }  


第三步:建立消費者類 
Java程式碼  收藏程式碼
  1. publicclass Consumer implements Runnable {  
  2.     private SyncBasket basket;  
  3.     public Consumer(SyncBasket basket) {  
  4.         this.basket = basket;  
  5.     }  
  6.     publicvoid run() {  
  7.         for(int i=0; i<20; i++) {  
  8.             Bread bread = basket.pop();  
  9.             System.out.println("Consumer eat: "+bread);  
  10.             try {  
  11.                 Thread.sleep((int) (Math.random() * 1000));  
  12.             } catch (InterruptedException e) {  
  13.                 e.printStackTrace();  
  14.             }  
  15.         }  
  16.     }  
  17. }  


第四步:建立饅頭物件類 
Java程式碼  收藏程式碼
  1. publicclass Bread {  
  2.     privateint id;  
  3.     public Bread(int id){  
  4.         this.id=id;  
  5.     }  
  6.     @Override
  7.     public String toString() {  
  8.         return String.valueOf(id);  
  9.     }         
  10. }  


第五步:建立測試類 
Java程式碼  收藏程式碼
  1. publicclass TestProConsumer {  
  2.     publicstaticvoid main(String[] args) {  
  3.         SyncBasket basket=new SyncBasket();  
  4.         Producer producer=new Producer(basket);  
  5.         Consumer consumer=new Consumer(basket);  
  6.         new Thread(producer).start();  
  7.         new Thread(consumer).start();  
  8.     }  
  9. }  


到此生產者消費者的小例子結束,希望能起到拋磚引玉的作用。