A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© vermouth 中级黑马   /  2015-1-16 16:33  /  1086 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多消费者 多生产者
同时生产和消费,最大库存量20.

将生产和消费放到两个实现了Runnable类中,使多个他们能够同时运行
在Resource类中,单例模式创建仓库资源实例,
实现了生产和消费两个方法,使用synchronized同步方法
full和empty控制库存量决定是否能够生产和消费,使用while循环wait判断条件,notify通知所有等待线程能够使用共享数据。

没有用到1.5封装的同步对象,只为了熟悉生产者消费者的经典模型,多多指教

  1. public class PCRDemo{
  2.         public static void main(String [] args){
  3.                 Producer p = new Producer();
  4.                 Customer c = new Customer();
  5.                
  6.                 Thread t1 = new Thread(p);
  7.                 Thread t2 = new Thread(p);
  8.                 Thread t3 = new Thread(p);
  9.                
  10.                 Thread t4 = new Thread(c);
  11.                 Thread t5 = new Thread(c);
  12.                 Thread t6 = new Thread(c);
  13.                
  14.                 t1.start();
  15.                 t2.start();
  16.                 t3.start();
  17.                 t4.start();
  18.                 t5.start();
  19.                 t6.start();
  20.         }
  21. }

  22. class Resource{
  23.         private static Resource resource = null;
  24.         public boolean empty = true ;
  25.         public boolean full = false ;
  26.         private String resName = "res";
  27.         public int count = 0;
  28.         private Resource(){}
  29.        
  30.         public static Resource getInstance(){
  31.                 if(resource == null){
  32.                         synchronized(Resource.class){
  33.                                 if(resource == null)
  34.                                         resource = new Resource();
  35.                         }
  36.                 }
  37.                 return resource;
  38.         }
  39.        
  40.         public synchronized void produce(){
  41.                 while (full){
  42.                         try{
  43.                                 this.wait();
  44.                         }
  45.                         catch(Exception e){
  46.                                 throw new RuntimeException("It is full!");
  47.                         }
  48.                 }
  49.                 count ++;
  50.                 String name = resName+"-"+ count;
  51.                 System.out.println(Thread.currentThread().getName()+": Produce "+name+"   It has "+count+"Resources ");
  52.                 empty = false;
  53.                 if(count>=20){
  54.                         full = true;
  55.                 }
  56.                 notifyAll();
  57.                 try{
  58.                         Thread.sleep(60);
  59.                 }
  60.                 catch(Exception e){
  61.                 }
  62.         }
  63.        
  64.         public synchronized void consume(){
  65.                 while (empty){
  66.                         try{
  67.                                 this.wait();
  68.                         }
  69.                         catch(Exception e){
  70.                         }
  71.                 }
  72.                 String name = resName+"-"+ count;
  73.                 count --;
  74.                 System.out.println(Thread.currentThread().getName()+": Consume "+name+"   It has "+count+"Resources ");
  75.                 full = false;
  76.                 if(count <= 0){
  77.                         empty=true;               
  78.                 }
  79.                 notifyAll();
  80.                 try{
  81.                         Thread.sleep(10);
  82.                 }
  83.                 catch(Exception e){
  84.                 }
  85.         }
  86. }

  87. class Producer implements Runnable{
  88.         private Resource resource = Resource.getInstance();
  89.         public void run(){
  90.                 while (true)
  91.                         resource.produce();
  92.         }
  93. }

  94. class Customer implements Runnable{
  95.         private Resource resource = Resource.getInstance();
  96.         public void run(){
  97.                 while (true)
  98.                         resource.consume();
  99.         }
  100. }
复制代码





2 个回复

倒序浏览
哇,你写的真好,不过还是有几点感觉有点问题,(1)单例模式的话,你应该私有化Resource类的构造方法,但是你没有。(2)感觉你那个empty和full没什么用,完全可以使用count进行判断。其他觉得写得都非常好,例如单例模式的双if,而且使用了类级别的锁,还有生产和消费方法中用while进行循环判断,很不错。
回复 使用道具 举报
兮兮之c 发表于 2015-1-24 23:46
哇,你写的真好,不过还是有几点感觉有点问题,(1)单例模式的话,你应该私有化Resource类的构造方法,但 ...

29 行 是单例的构造方法私有化

使用empty和full是自己在写代码时候,下意识使用锁的思想,大概用count会没那种感觉

谢谢指导~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马