java线程:三种方式实现生产者消费者问题_3

java线程:三种方式实现生产者消费者问题_3

分类: java_线程   36人阅读  评论(0)  收藏  举报

实现生产者——消费者问题的第三种方式:使用java5提供的java.util.concurrent.BlockingQueue阻塞队列实现,你可以看到仓库类代码实现更加简洁了。同样,生产者类、消费者类都不变化(《java线程:三种方式实现生产者消费者问题_1》),以下是仓库类的代码实现:

 

[java]  view plain copy
  1. <span style="font-family:Arial;">  
  2. /** 
  3.  * 仓库: 
  4.  * 先生产的先消费:采用JDK提供的阻塞队列实现生产者——消费者的问题 
  5.  */  
  6. public class Storage {  
  7.       
  8.     public static final int MAX_SIZE = 100;  
  9.     // 阻塞队列  
  10.     private BlockingQueue<Object> container = new ArrayBlockingQueue<Object>(MAX_SIZE);  
  11.       
  12.     // 从仓库中存放一个产品:  
  13.     public void put(){  
  14.         try {  
  15.             sop("仓库现有数量为"+ container.size() +", 开始生产");  
  16.             /*  
  17.              * 关于put()、offer()、add(): 
  18.              *      put() 
  19.              *          如果队列中数据已满,则等待,该方法是阻塞的 
  20.              *      offer() 
  21.              *          如果队列中数据已满,则返回插进队列的元素 
  22.              *      add() 
  23.              *          如果队列中数据已满,则抛出异常 
  24.              */  
  25.             container.put(new Object());  
  26.         } catch (InterruptedException e) {  
  27.         }  
  28.     }  
  29.       
  30.     // 从仓库中取出一个产品:  
  31.     public Object get(){  
  32.         Object obj = null;  
  33.         try {  
  34.             sop("仓库现有数量为"+ container.size() +", 开始消费");  
  35.             /* 
  36.              * 关于take()、poll()、remove(): 
  37.              *      take(): 
  38.              *          如果队列没有数据,则一直等待队列的头部,直到头元素可用,该方法是阻塞的 
  39.              *      poll(): 
  40.              *          如果队列没有数据,则在指定的时间内等待队列的头部 
  41.              *      remove(): 
  42.              *          如果队列中没有元素,则抛出异常 
  43.              */  
  44.             obj = container.take();  
  45.         } catch (InterruptedException e) {  
  46.         }  
  47.         return obj;  
  48.     }  
  49.       
  50.     private static void sop(Object obj){  
  51.         System.out.println(obj);  
  52.     }  
  53. }  
  54.   
  55. </span>  

以下是测试代码:

 

 

[java]  view plain copy
  1. <span style="font-family:Arial;">  
  2. public class Test {  
  3.       
  4.     public static void main(String[] args) {  
  5.         Storage storage = new Storage();  
  6.           
  7.         Consumer con = new Consumer(storage);  
  8.         Producer pro = new Producer(storage);  
  9.           
  10.         new Thread(pro).start();  
  11.         new Thread(pro).start();  
  12.         new Thread(pro).start();  
  13.         new Thread(pro).start();  
  14.           
  15.           
  16. //      new Thread(con).start();  
  17. //      new Thread(con).start();  
  18. //      new Thread(con).start();  
  19. //      new Thread(con).start();  
  20.         new Thread(con).start();  
  21.     }  
  22. }  
  23.  </span>  

你可能感兴趣的:(java线程)