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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏凡 中级黑马   /  2013-5-2 22:02  /  1403 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 夏凡 于 2013-5-8 19:19 编辑

程序运行时报错,寻求高手解答,谢谢!
  1. import java.util.concurrent.locks.*;
  2. class Goods
  3. {
  4.         private String name;
  5.         private int num = 200;
  6.         private boolean flag = false;

  7.         private Lock lock = new ReentrantLock();
  8.         private Condition condition_pro = lock.newCondition();
  9.         private Condition condition_con = lock.newCondition();
  10.         
  11.         public void setInfo(String name) throws InterruptedException//因为没写catch
  12.         {
  13.                 lock.lock();
  14.                 try
  15.                 {
  16.                         while(flag)
  17.                         {
  18.                                 condition_pro.await();
  19.                         }

  20.                         this.name = name+"----"+num--;

  21.                         System.out.println(Thread.currentThread().getName() + "----生产者----" + this.name);

  22.                         this.flag = true;
  23.                         condition_con.signal();
  24.                 }
  25.                 finally
  26.                 {
  27.                         lock.unlock();
  28.                 }
  29.         }

  30.         public void getInfo()throws InterruptedException
  31.         {
  32.                 try
  33.                 {
  34.                         while(!flag)//此处需要用到while,循环判断
  35.                         {
  36.                                 condition_con.await();
  37.                         }

  38.                         System.out.println(Thread.currentThread().getName() + "----消费者----" + this.name);

  39.                         this.flag = false;
  40.                         condition_pro.signal();
  41.                 }
  42.                 finally
  43.                 {
  44.                         lock.unlock();
  45.                 }
  46.         }
  47. }

  48. class Producer implements Runnable//创建线程
  49. {
  50.         private Goods apple;

  51.         Producer(Goods apple_ipad)//有什么用啊?
  52.         {
  53.                 apple = apple_ipad;
  54.         }

  55.         public void run()
  56.         {
  57.                 while(true)
  58.                 {
  59.                         try
  60.                         {
  61.                                 apple.setInfo("苹果");
  62.                         }
  63.                         catch (InterruptedException e)
  64.                         {
  65.                         }
  66.                 }
  67.         }
  68. }

  69. class Consumer implements Runnable
  70. {
  71.         private Goods apple;

  72.         Consumer(Goods apple_ipad)
  73.         {
  74.                 apple = apple_ipad;
  75.         }

  76.         public void run()
  77.         {
  78.                 while(true)
  79.                 {
  80.                         try
  81.                         {
  82.                                 apple.getInfo();
  83.                         }
  84.                         catch (InterruptedException e)
  85.                         {
  86.                         }
  87.                 }
  88.         }
  89. }

  90. class ProducerConsumer2
  91. {
  92.         public static void main(String[] args)
  93.         {
  94.                 Goods ipad4 = new Goods();

  95.                 Producer p = new Producer(ipad4);
  96.                 Consumer c = new Consumer(ipad4);

  97.                 Thread tp1 = new Thread( p, "factory1");
  98.                 Thread tp2 = new Thread( p, "factory2");

  99.                 Thread tc1 = new Thread(c, "buyer1");
  100.                 Thread tc2 = new Thread(c, "buyer2");

  101.                 tp1.start();
  102.                 tp2.start();

  103.                 tc1.start();
  104.                 tc2.start();
  105.         }
  106. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 鼓励

查看全部评分

4 个回复

正序浏览
  1. import java.util.concurrent.locks.*;
  2. class Goods
  3. {
  4.         private String name;
  5.         private int num = 200;
  6.         private boolean flag = false;

  7.         private Lock lock = new ReentrantLock();
  8.         private Condition condition_pro = lock.newCondition();
  9.         private Condition condition_con = lock.newCondition();
  10.         
  11.         public void setInfo(String name) throws InterruptedException//因为没写catch
  12.         {
  13.                 lock.lock();
  14.                 try
  15.                 {
  16.                         while(num>1)
  17.                         {
  18.                                 while(flag)
  19.                         {
  20.                                 condition_pro.await();
  21.                         }

  22.                         this.name = name+"----"+num--;

  23.                         System.out.println(Thread.currentThread().getName() + "----生产商----" + this.name);

  24.                         this.flag = true;
  25.                      
  26.                         condition_con.signal();
  27.                         }
  28.                         if(num==0){
  29.                                 System.out.println(name+"产品已经生产完毕!");
  30.                                 System.exit(0);
  31.                         }
  32.                         
  33.                 }
  34.                 finally
  35.                 {
  36.                         lock.unlock();
  37.                 }
  38.         }

  39.         public void getInfo()throws InterruptedException
  40.         {
  41.                         lock.lock();//  消费商品这没有上锁!
  42.                 try
  43.                 {
  44.                         while(!flag)//此处需要用到while,循环判断
  45.                         {
  46.                                 condition_con.await();
  47.                         }

  48.                         System.out.println(Thread.currentThread().getName() + "----消费者----" + this.name);

  49.                         this.flag = false;
  50.                         condition_pro.signal();
  51.                 }
  52.                 finally
  53.                 {
  54.                         lock.unlock();
  55.                 }
  56.         }
  57. }

  58. class Producer implements Runnable//创建线程
  59. {
  60.         private Goods apple;

  61.         Producer(Goods apple_ipad)//有什么用啊?    //  将产品对象Goods传入到生产商 ,对Goods进行生产。
  62.         {
  63.                 apple = apple_ipad;
  64.         }

  65.         public void run()
  66.         {
  67.                 while(true)
  68.                 {
  69.                         try
  70.                         {
  71.                                 apple.setInfo("苹果");
  72.                         }
  73.                         catch (InterruptedException e)
  74.                         {
  75.                         }
  76.                 }
  77.         }
  78. }

  79. class Consumer implements Runnable
  80. {
  81.         private Goods apple;

  82.         Consumer(Goods apple_ipad)
  83.         {
  84.                 apple = apple_ipad;
  85.         }

  86.         public void run()
  87.         {
  88.                 while(true)
  89.                 {
  90.                         try
  91.                         {
  92.                                 apple.getInfo();
  93.                         }
  94.                         catch (InterruptedException e)
  95.                         {
  96.                         }
  97.                 }
  98.         }
  99. }

  100. class ProducerConsumer2
  101. {
  102.         public static void main(String[] args)
  103.         {
  104.                 Goods ipad4 = new Goods();

  105.                 Producer p = new Producer(ipad4);
  106.                 Consumer c = new Consumer(ipad4);

  107.                 Thread tp1 = new Thread( p, "factory1");
  108.                 Thread tp2 = new Thread( p, "factory2");

  109.                 Thread tc1 = new Thread(c, "buyer1");
  110.                 Thread tc2 = new Thread(c, "buyer2");

  111.                 tp1.start();
  112.                 tp2.start();

  113.                 tc1.start();
  114.                 tc2.start();
  115.         }
  116. }
复制代码

点评

是的,谢谢!!!  发表于 2013-5-8 19:20
回复 使用道具 举报
李松柏 发表于 2013-5-3 20:29
Producer(Goods apple_ipad)//有什么用啊?
        {
                apple = apple_ipad;

我的问题主要不是这,是这个程序运行会报错,还是谢谢你
回复 使用道具 举报
程序 第36行  少一句:lock.lock();{:soso_e127:}

点评

犀利!搞定!灰常感谢  发表于 2013-5-8 09:37
回复 使用道具 举报
Producer(Goods apple_ipad)//有什么用啊?
        {
                apple = apple_ipad;
        }

有参构造函数,给apple初始化
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马