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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 王靖远 于 2013-5-21 13:09 编辑
  1. class ProducerConsumerDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Resource r = new Resource();

  6.                 Producer pro = new Producer(r);
  7.                 Consumer con = new Consumer(r);
  8.                
  9.                 Thread t1 = new Thread(pro);
  10.                 Thread t2 = new Thread(con);
  11.                
  12.                 t1.start();
  13.                 t2.start();
  14.         }
  15. }

  16. class Resource
  17. {
  18.         private String name;
  19.         private int count = 1;
  20.         private boolean flag = false;

  21.         public synchronized void set(String name)
  22.         {
  23.                 if(flag)
  24.                         try{this.wait();}catch(Exception e){}
  25.                 this.name =name+"--"+count++;

  26.                 System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
  27.                 flag = true;
  28.                 this.notify();
  29.         }
  30.         public void out()
  31.         {
  32.                 if(!flag)
  33.                         try{this.wait();}catch(Exception e){}
  34.                 System.out.println(Thread.currentThread().getName()+"...消费者..."+this.name);
  35.                 flag = false;
  36.                 this.notify();
  37.         }
  38. }

  39. class Producer implements Runnable
  40. {
  41.         private Resource res;
  42.         Producer(Resource res)
  43.         {
  44.                 this.res = res;
  45.         }
  46.         public void run()
  47.         {
  48.                 while(true)
  49.                 {
  50.                         res.set("+商品+");
  51.                 }
  52.         }
  53. }

  54. class Consumer implements Runnable
  55. {
  56.         private Resource res;
  57.         Consumer(Resource res)
  58.         {
  59.                 this.res = res;
  60.         }
  61.         public void run()
  62.         {
  63.                 while(true)
  64.                 {
  65.                         res.out();
  66.                 }
  67.         }
  68. }
复制代码
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at com.haha.Resource.out(ProducerConsumerDemo.java:41)
        at com.haha.Consumer.run(ProducerConsumerDemo.java:72)
        at java.lang.Thread.run(Thread.java:722)
Thread-0...生产者...+商品+--1
Thread-1...消费者...+商品+--1


3 个回复

倒序浏览
34行缺少“synchronized”,就这么一个问题。抛出IllegalMonitorStateException异常,表明在对某个对象上调用wait()方法进行线程等待(让其他竞争执行该代码的线程上锁)时,没有对该对象执行同步操作。仔细点就好了。
回复 使用道具 举报
无妄无涯 发表于 2013-5-21 13:06
34行缺少“synchronized”,就这么一个问题。抛出IllegalMonitorStateException异常,表明在对某个对象上调 ...

非常感谢。这块才学练习较少,这些小问题我自己检查一个小时可能都查不出来。
回复 使用道具 举报
本帖最后由 无妄无涯 于 2013-5-21 13:12 编辑
王靖远 发表于 2013-5-21 13:08
非常感谢。这块才学练习较少,这些小问题我自己检查一个小时可能都查不出来。 ...

别客气,熟悉了就好,现在代码量少,找问题还是简单的。另外,建议学习下JDK1.5中引入的线程池,效率高些而且功能更强大。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马