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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 奋斗的小胖子 中级黑马   /  2014-2-14 11:27  /  1690 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 奋斗的小胖子 于 2014-2-15 09:57 编辑
  1. import java.util.concurrent.locks.*;
  2. public class ProduceAndConsume
  3. {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args)
  8.         {
  9.                 Drumstick drums=new Drumstick();
  10.                 Produce2 pro1=new Produce2(drums);
  11.                 Consume2 con1=new Consume2(drums);
  12.                 //一个线程控制消费,一个控制生产
  13.                 Thread t1=new Thread(pro1);
  14.                 Thread t2=new Thread(con1);
  15.                 Thread t3=new Thread(pro1);
  16.                 Thread t4=new Thread(con1);
  17.                 t1.start();
  18.                 t2.start();
  19.                 t3.start();
  20.                 t4.start();
  21.                
  22.         }
  23. }
  24. //定义一个生产者类,负责生产
  25. class Produce2 implements Runnable
  26. {
  27.         /*生产者类与消费者类里面同时调用 同一个类的对象,
  28.          * 以这个类的对象确保操作是同一个资源
  29.          */
  30.         private Drumstick d;
  31.         Produce2 (Drumstick d)
  32.         {
  33.                 this.d=d;
  34.         }
  35.         public void run()
  36.         {
  37.                 while(true)
  38.                 {
  39.                         d.pro("鸡腿");
  40.                         
  41.                 }
  42.         }
  43. }
  44. //定义一个消费类,负责消费
  45. class Consume2 implements Runnable
  46. {
  47.         private Drumstick d;
  48.         Consume2 (Drumstick d)
  49.         {
  50.                 this.d=d;
  51.         }
  52.         public void run()
  53.         {
  54.                 while(true)
  55.                 {
  56.                         d.con();
  57.                 }
  58.         }
  59. }
  60. //定义个类为生产与消费的地方
  61. class Drumstick
  62. {
  63.         
  64.         private String drums; //产品的名字
  65.         //建立一个布尔型的类,来确保线程调用的情况
  66.         private boolean flag=false;
  67.         private int  cons=0;//产品的数量
  68.         public void Drustick(String drums)
  69.         {
  70.                 this.drums=drums;
  71.         }
  72.     Lock lock=new ReentrantLock();//不可以使用ReentrantLock() 编译报错
  73.         public void pro(String drums)
  74.         {
  75.                 lock.lock();//编译报错
  76.                 try
  77.                 {
  78.                         while(flag==true)
  79.                         {  //如果生产了,先休息下,消费下
  80.                                 try
  81.                                 {
  82.                                         this.wait();
  83.                                 }
  84.                                 catch (Exception e)
  85.                                 {
  86.                                        
  87.                                 }
  88.                                 
  89.                         }
  90.                         this.drums=drums+cons;
  91.                         cons++;
  92.                         System.out.println(Thread.currentThread().getName()+
  93.                                            "生产---"+this.drums);
  94.                         flag=true;
  95.                         this.notifyAll();
  96.                 }
  97.                 catch (Exception e) {
  98.                         // TODO Auto-generated catch block
  99.                         e.printStackTrace();
  100.                 }
  101.                 finally
  102.                 {
  103.                         lock.unlock();//编译报错
  104.                 }
  105.         
  106.         }
  107.         public synchronized void con()
  108.         {
  109.                 while(flag==false)
  110.                 {
  111.                         //消费完了,没有生产,不能在消费,休息
  112.                         try
  113.                         {
  114.                                 this.wait();
  115.                         }
  116.                         catch (Exception e)
  117.                         {
  118.                         
  119.                         }
  120.                 }
  121.                 System.out.println(Thread.currentThread().getName()+
  122.                                    "消费---"+this.drums);
  123.                 flag=false;
  124.                 this.notifyAll();
  125.         
  126.         }
  127.         
  128. }
复制代码
我本来要用lock锁代替synchronized锁进行,优化,但是编译报错,不能使用,哪位帮我看下代码是怎么回事,小弟非常焦急啊

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

8 个回复

倒序浏览
代码没问题啊 ,我试了下都没报错啊 !
回复 使用道具 举报
itpower 发表于 2014-2-14 16:48
代码没问题啊 ,我试了下都没报错啊 !




还是错的,你入学考试如何了?你什么怎么复习的啊  ,我以前好多都忘了,现在都在猛复习的
回复 使用道具 举报
奋斗的小胖子 发表于 2014-2-14 17:06
还是错的,你入学考试如何了?你什么怎么复习的啊  ,我以前好多都忘了,现在都在猛复习的
...

后天面试,入学考试得了29.1分
回复 使用道具 举报
itpower 发表于 2014-2-14 17:14
后天面试,入学考试得了29.1分

面试是你点下个环节申请面试,再通知你面试,还是你交完入学的测试,那边看完好就通知你面试啊。还有你什么怎么复习的,教教我啊。我现在复习老烦了,而且感觉效率极低啊。
回复 使用道具 举报
奋斗的小胖子 发表于 2014-2-14 17:17
面试是你点下个环节申请面试,再通知你面试,还是你交完入学的测试,那边看完好就通知你面试啊。还有你什 ...

我是点了视频面试申请,然后就接到老师的电话通知了,我没复习,我平时都是做题,用那复习哪
回复 使用道具 举报
itpower 发表于 2014-2-14 17:27
我是点了视频面试申请,然后就接到老师的电话通知了,我没复习,我平时都是做题,用那复习哪 ...

你博客得了多少分啊?前面总共有多少分了?
回复 使用道具 举报
我自己把lock 改为Reentainlock()  ,就可以了  。lock是不行的 我也搞不懂是为什么。
回复 使用道具 举报
你的代码中判断标志更改的时候就点问题吧,应该是一生产者在生产结束后应该改成false,而消费者应该改成ture吧
还有你既然用了Lock类,在建立等待唤醒方法怎么不用Conditon对象来实现唤醒呢?貌似this.notifyAll()只能用在同步代码中吧~~我初学,也不知道说得对不对
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马