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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 wnmmp 于 2014-8-7 23:09 编辑

这是JDK1.6 API里Condition接口里面多生产者多消费者生产消费多个蛋糕的模型,看了好久没有看懂,应该是没有具体对象,所以比较抽象,毕老师说这个开发时复制完拿来就能用,谁有这个代码的应用实例?
class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition();
   final Condition notEmpty = lock.newCondition();

   final Object[] items = new Object[100];
   int putptr, takeptr, count;

   public void put(Object x) throws InterruptedException {
     lock.lock();
     try {
       while (count == items.length)
         notFull.await();
       items[putptr] = x;
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally {
       lock.unlock();
     }
   }

   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0)
         notEmpty.await();
       Object x = items[takeptr];
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   }
}

6 个回复

倒序浏览
我也刚学了这个!我觉得这里 这一节主要强调的是多线程的安全问题,一进一出两个线程同时操作一个数据,可能产生安全问题,知道这个锁怎么用就可以了!不必纠结于应用实例。
回复 使用道具 举报
  1. import java.util.concurrent.locks.*;

  2. //jdk 1.5版本升级版
  3. class ProducerConsumerDemo1
  4. {
  5.         public static void main(String[] args)
  6.         {
  7.                 Resource r=new Resource();
  8.                 Producer p=new Producer(r);
  9.                 Consumer c=new Consumer(r);
  10.                 Thread t1=new Thread(p);
  11.                 Thread t2=new Thread(p);
  12.                 Thread t3=new Thread(c);
  13.                 Thread t4=new Thread(c);
  14.                 t1.start();
  15.                 t2.start();
  16.                 t3.start();
  17.                 t4.start();
  18.                 /*
  19.                 new Thread(new Producer(r)).start();
  20.                 new Thread(new Producer(r)).start();
  21.                 new Thread(new Consumer(r)).start();
  22.                 new Thread(new Consumer(r)).start();
  23.                 */
  24.         }
  25. }
  26. class Resource
  27. {
  28.         private String name;
  29.         private int count=0;
  30.         private Boolean flag=false;
  31.         private ReentrantLock lock=new ReentrantLock();
  32.         private Condition conditiona=lock.newCondition();
  33.         private Condition conditionb=lock.newCondition();
  34.         public void setName(String name)throws Exception{
  35.                 lock.lock();
  36.                 try
  37.                 {
  38.                         while(flag){
  39.                                 conditiona.await();
  40.                         }
  41.                         this.name=name+count++;
  42.                         System.out.println(Thread.currentThread().getName()+"...生产者"+this.name+"++");
  43.                         flag=true;
  44.                         conditionb.signal();
  45.                 }finally{
  46.                         lock.unlock();
  47.                 }
  48.         }
  49.         public void  out() throws Exception{
  50.                 lock.lock();
  51.                 try
  52.                 {
  53.                         while(!flag){
  54.                                 conditionb.await();
  55.                         }
  56.                         System.out.println(Thread.currentThread().getName()+"......消费者..."+this.name+"====");
  57.                         flag=false;
  58.                         conditiona.signal();
  59.                 }finally{
  60.                         lock.unlock();
  61.                 }
  62.         }
  63. }
  64. class Producer implements Runnable
  65. {
  66.         private Resource r;
  67.         Producer(Resource r){
  68.                 this.r=r;
  69.         }
  70.         public void run(){
  71.                 while(true){
  72.                         try
  73.                         {
  74.                                 r.setName("+商品+");
  75.                         }
  76.                         catch (Exception e)
  77.                         {
  78.                         }
  79.                        
  80.                 }
  81.         }
  82. }
  83. class Consumer implements Runnable
  84. {
  85.         private Resource r;
  86.         Consumer(Resource r){
  87.                 this.r=r;
  88.         }
  89.         public void run(){
  90.                 while(true){
  91.                         try
  92.                         {
  93.                                 r.out();
  94.                         }
  95.                         catch (Exception e)
  96.                         {
  97.                         }
  98.                 }
  99.         }
  100. }
复制代码
回复 使用道具 举报

额,可能是我没表达清楚,这个我明白,我说的是资源数量不止一个,比如有一百个蛋糕的货架,货架不满生产者就可以生产,货架不空消费者就可以消费
回复 使用道具 举报
yuli2039 发表于 2014-8-7 18:27
我也刚学了这个!我觉得这里 这一节主要强调的是多线程的安全问题,一进一出两个线程同时操作一个数据,可 ...

我有强迫症,不懂的东西一点没接触就算了,接触了还没搞懂就很不舒服了
回复 使用道具 举报

PS,你这个代码编辑器怎么设置的?我怎么没找到
回复 使用道具 举报
这个已经想通了,发个链接
http://bbs.itheima.com/thread-136484-1-1.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马