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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我为你着迷 金牌黑马   /  2014-7-13 12:24  /  1100 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class ProducerConsumerDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Resource r=new Resource();
  6.                
  7.                 Producer pro=new Producer(r);
  8.                
  9.                 Consumer con=new Consumer(r);
  10.                
  11.                 Thread t1=new Thread(pro);
  12.                 Thread t2=new Thread(pro);
  13.                 Thread t3=new Thread(con);
  14.                 Thread t4=new Thread(con);
  15.                 t1.start();
  16.                 t2.start();
  17.                 t3.start();
  18.                 t4.start();
  19.         }
  20. }



  21. class Resource
  22. {
  23.         private String name;
  24.         private int count=1;
  25.         private boolean flag=false;
  26.        
  27.         public synchronized void  set(String name)
  28.         {
  29.                 while(flag)
  30.                    try{wait();}catch(Exception e){}
  31.                 this.name=name+"--"+count++;
  32.                
  33.                 System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
  34.                 flag=true;
  35.                 this.notifyAll();
  36.                        
  37.         }       
  38.        
  39.         public void out()
  40.         {
  41.                 while(!flag)
  42.                    try{wait();}catch(Exception e){}
  43.                 System.out.println(Thread.currentThread().getName()+"...消费者........"+this.name);
  44.                 flag=false;
  45.                 this.notifyAll();
  46.         }
  47. }


  48. class Producer implements Runnable
  49. {
  50.         private Resource res;
  51.        
  52.         Producer(Resource res)
  53.         {
  54.                 this.res=res;       
  55.         }
  56.         public void run()
  57.         {
  58.                 while(true)
  59.                 {
  60.                         res.set("+商品+");       
  61.                 }
  62.   }
  63.        
  64. }


  65. class Consumer implements Runnable
  66. {
  67.          private Resource res;
  68.          
  69.          Consumer(Resource res)
  70.          {
  71.                  this.res=res;       
  72.          }
  73.          public void run()
  74.          {
  75.                  while(true)
  76.           {
  77.                   res.out();       
  78.           }
  79.          }
  80. }
复制代码
D:\java0218\day06>java ProducerConsumerDemo
Thread-0...生产者...+商品+--1
Thread-1...消费者...+商品+--1
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at Resource.out(ProducerConsumerDemo.java:44)
        at Consumer.run(ProducerConsumerDemo.java:80)
        at java.lang.Thread.run(Thread.java:744)
大家好  运行的时候出现上边提示 我看不懂 哪位大神帮我分析下这个是什么意思啊  代码是和视频里边一模一样的  让我很郁闷!

7 个回复

倒序浏览
出现问题说明肯定跟老毕的代码不一样,毋庸置疑,然后看报的什么异常,一看是无效的监视器状态异常,那就肯定是锁出问题了,然后就可以找到用到锁的代码,无非就一个set方法一个out方法,果然42行,少了个synchronized同步锁。
回复 使用道具 举报
☆枫の云 发表于 2014-7-13 13:01
出现问题说明肯定跟老毕的代码不一样,毋庸置疑,然后看报的什么异常,一看是无效的监视器状态异常,那就肯 ...

啊  谢谢你啊   哥们  我好感动   有机会请你喝啤酒{:3_64:}
回复 使用道具 举报
我为你着迷 发表于 2014-7-13 14:17
啊  谢谢你啊   哥们  我好感动   有机会请你喝啤酒

我看了半天  都没有找出bug
回复 使用道具 举报
我为你着迷 发表于 2014-7-13 14:17
啊  谢谢你啊   哥们  我好感动   有机会请你喝啤酒

那倒时候少了炸鸡可不行啊,哈哈,开个玩笑,其实我也看了半天,只不过装作很高端的样子,前面的内容也忘得差不多
回复 使用道具 举报
资源类out方法根本没synchronized      
回复 使用道具 举报
Mr.Hao 发表于 2014-7-13 16:36
资源类out方法根本没synchronized

嗯 是的  谢谢
回复 使用道具 举报
☆枫の云 发表于 2014-7-13 15:40
那倒时候少了炸鸡可不行啊,哈哈,开个玩笑,其实我也看了半天,只不过装作很高端的样子,前面的内容也忘 ...

来自星星的你 哈哈
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马