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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

程序是想实现,多个生产者,多个消费者,资源有多个(通俗来讲,仓库中可以存放多个产品,以往的程序只是一个),程序如下,实在不知道哪里错了。求高手解答!
  1. package com.bocsoft.study;

  2. import java.util.ArrayList;
  3. import java.util.concurrent.locks.Condition;
  4. import java.util.concurrent.locks.Lock;
  5. import java.util.concurrent.locks.ReentrantLock;

  6. public class ProduceConsume {

  7.         public static void main(String[] args) {
  8.                 Resource r = new Resource();
  9.                 Produce p1 = new Produce(r,"苹果");
  10.                 Produce p2 = new Produce(r,"香蕉");
  11.                 Produce p3 = new Produce(r,"橘子");
  12.                 Consume c = new Consume(r);
  13.                 Thread t1 = new Thread(p1,"苹果生产者");
  14.                 Thread t2 = new Thread(p2,"香蕉生产者");
  15.                 Thread t3 = new Thread(p3,"橘子生产者");
  16.                 Thread t4 = new Thread(c,"消费者1号");
  17.                 Thread t5 = new Thread(c,"消费者2号");
  18.                 t1.start();
  19.                 t2.start();
  20.                 t3.start();
  21.                 t4.start();
  22.                 t5.start();
  23.         }

  24. }

  25. class Resource {
  26.         ArrayList<Food> al = new ArrayList<Food>();// 仓库中可以存放多个产品
  27.         int max = 5;// 定义最多存放的产品数量
  28.         Lock lock = new ReentrantLock();// 创建锁对象
  29.         Condition p_condition = lock.newCondition();// 生产者使用的Condition
  30.         Condition c_condition = lock.newCondition();// 消费者使用的Condition

  31.         void put(Food food) {
  32.                 lock.lock();// 获取锁
  33.                 try {
  34.                         while (!(al.size() < max))
  35.                                 // 若资源已满则等待消费者消费
  36.                                 try {
  37.                                         p_condition.await();
  38.                                 } catch (InterruptedException e) {
  39.                                         e.printStackTrace();
  40.                                 }
  41.                         // 未满则生产产品
  42.                         al.add(food);// 将产品添加进产品库
  43.                         System.out.println(Thread.currentThread().getName() + "生产了产品:----------" + food);
  44.                         c_condition.signal();// 唤醒消费者消费

  45.                 } finally {
  46.                         lock.unlock();// 如遇异常,锁必须释放
  47.                 }
  48.         }

  49.         void get() {
  50.                 lock.lock();// 获取锁
  51.                 try {
  52.                         while (al.size() == 0)//若无资源消费则等待
  53.                                 try {
  54.                                         c_condition.await();
  55.                                 } catch (InterruptedException e) {
  56.                                         e.printStackTrace();
  57.                                 }
  58.                         Food food = al.remove(0);//消费一个产品,这里为了方便起见,每个消费者都消费数组中的第一个元素
  59.                         System.out.println(Thread.currentThread().getName() + "消费了产品:----------" + food);
  60.                         p_condition.signal();
  61.                 } finally {
  62.                         lock.unlock();// 如遇异常,锁必须释放
  63.                 }
  64.         }
  65. }

  66. class Produce implements Runnable {
  67.         Resource r;
  68.         String name;//生产的产品的名称
  69.         Produce(Resource r,String name) {
  70.                 this.r = r;
  71.                 this.name = name;
  72.                
  73.         }

  74.         public void run() {
  75.                 Food food = new Food(name);
  76.                 r.put(food);
  77.         }
  78. }

  79. class Consume implements Runnable {
  80.         Resource r;

  81.         Consume(Resource r) {
  82.                 this.r = r;
  83.         }

  84.         public void run() {
  85.                 r.get();
  86.         }
  87. }

  88. class Food {
  89.         String name;

  90.         Food(String name) {
  91.                 this.name = name;
  92.         }

  93.         @Override
  94.         public String toString() {
  95.                 return name;
  96.         }
  97. }
复制代码



2 个回复

倒序浏览
        public void run() {
               while(true)
                r.get();
        }
        public void run() {
                Food food = new Food(name);
                while(true)
                r.put(food);
        }

点评

额,发现了,我太傻了,这个都忘记写了  发表于 2015-1-16 10:36
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马