JAVA线程(生产者与消费者)

来源:互联网 发布:朱炫热血知乎 编辑:程序博客网 时间:2024/05/21 16:55
业务需求: 
    生产20个馒头,篮子里只能放6个馒头。 
    消费者发现篮子里有馒头可以食用时即可把馒头取出开始使用,直到篮子里馒头为空。 
    生产者发现篮子里的馒头不满足6个时,生产者开始生产馒头并放入篮子中。 

具体实现: 

第一步:创建盛放馒头的篮子类 

Java代码  收藏代码
  1. public class SyncBasket {  
  2.   
  3.     public Bread[] breads = new Bread[6];  
  4.   
  5.     private int index = 0;  
  6.   
  7.     public synchronized void push(Bread bread ) {  
  8.         while(index==this.breads.length){  
  9.             try{  
  10.                 this.wait();  
  11.             }catch(InterruptedException e){  
  12.                 e.printStackTrace();  
  13.             }     
  14.         }  
  15.         this.notifyAll();  
  16.         breads[index]=bread;  
  17.         index++;  
  18.     }  
  19.   
  20.     public synchronized Bread pop() {  
  21.         while(index==0){  
  22.             try{  
  23.                 this.wait();  
  24.             }catch(InterruptedException e){  
  25.                 e.printStackTrace();  
  26.             }  
  27.         }  
  28.         this.notifyAll();  
  29.         index--;  
  30.         return breads[index];  
  31.     }  
  32.   
  33. }  


第二步:创建生产者类 
Java代码  收藏代码
  1. public class Producer implements Runnable {  
  2.   
  3.     private SyncBasket basket;  
  4.       
  5.     public Producer(SyncBasket basket) {  
  6.         this.basket = basket;  
  7.     }  
  8.   
  9.     public void run() {  
  10.         for(int i=1;i<21;i++){  
  11.             Bread bread = new Bread(i);  
  12.             basket.push(bread);  
  13.             System.out.println("producer produce: " + bread);  
  14.             try {  
  15.                 Thread.sleep((int) (Math.random() * 1000));  
  16.             } catch (InterruptedException e) {  
  17.                 e.printStackTrace();  
  18.             }  
  19.         }  
  20.   
  21.     }  
  22. }  


第三步:创建消费者类 
Java代码  收藏代码
  1. public class Consumer implements Runnable {  
  2.   
  3.     private SyncBasket basket;  
  4.   
  5.     public Consumer(SyncBasket basket) {  
  6.         this.basket = basket;  
  7.     }  
  8.   
  9.     public void run() {  
  10.         for(int i=0; i<20; i++) {  
  11.             Bread bread = basket.pop();  
  12.             System.out.println("Consumer eat: "+bread);  
  13.             try {  
  14.                 Thread.sleep((int) (Math.random() * 1000));  
  15.             } catch (InterruptedException e) {  
  16.                 e.printStackTrace();  
  17.             }  
  18.         }  
  19.   
  20.     }  
  21.   
  22. }  


第四步:创建馒头对象类 
Java代码  收藏代码
  1. public class Bread {  
  2.     private int id;  
  3.   
  4.     public Bread(int id){  
  5.         this.id=id;  
  6.     }  
  7.       
  8.     @Override  
  9.     public String toString() {  
  10.         return String.valueOf(id);  
  11.     }         
  12. }  


第五步:创建测试类 
Java代码  收藏代码
  1. public class TestProConsumer {  
  2.   
  3.     public static void main(String[] args) {  
  4.         SyncBasket basket=new SyncBasket();  
  5.         Producer producer=new Producer(basket);  
  6.         Consumer consumer=new Consumer(basket);  
  7.         new Thread(producer).start();  
  8.         new Thread(consumer).start();  
  9.     }  
  10.   
  11. }  


到此生产者消费者的小例子结束,希望能起到抛砖引玉的作用。