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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 freeboyhrk 于 2013-4-6 10:57 编辑


  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.                 Thread t1 = new Thread(pro);
  9.                 Thread t2 = new Thread(pro);
  10.                 Thread t3 = new Thread(con);
  11.                 Thread t4 = new Thread(con);

  12.                 t1.start();
  13.                 t2.start();

  14.                 t3.start();
  15.                 t4.start();

  16.         }
  17. }

  18. class Resource
  19. {
  20.         private String name;
  21.         private int count = 1;
  22.         private boolean flag = false;
  23.         public synchronized void set(String name)
  24.         {
  25.                 while(flag)
  26.                         try{this.wait();}catch(Exception e){}
  27.                 this.name = name+"--"+count++;

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

  42. class Producer implements Runnable
  43. {
  44.         private Resource res;

  45.         Producer(Resource res)
  46.         {
  47.                 this.res = res;
  48.         }
  49.         public void run()
  50.         {
  51.                 while(true)
  52.                 {
  53.                         res.set("+商品+");
  54.                 }
  55.         }
  56. }

  57. class Consumer implements Runnable
  58. {
  59.         private Resource res;

  60.         Consumer(Resource res)
  61.         {
  62.                 this.res = res;
  63.         }
  64.         public void run()
  65.         {
  66.                 while(true)
  67.                 {
  68.                         res.out();
  69.                 }
  70.         }
  71. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

7 个回复

正序浏览
saghir 中级黑马 2015-4-25 15:10:13
8#
等待线程都存在线程池中的线程,notify通常唤醒第一个等待的线程。this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将对象本身的地址作为一个隐含参数传递给函数。不使用notify,此处应该不影响代码块的运行,为什么不一样,还有待研究(程序执行时没找到入口)。
回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
this.notify()与notify()的运行结果是一样的,函数需要被对象调用。那么函数都有一个所属对象引用。就是this
你多试几次,就会得到你想要的这个死锁的结果了。
不过,这个例子我记得应该是notifyAll();否则肯定会出现死锁的。由于CPU切换,仅使用notify();会导致解锁不完全,有可能对方的锁并没有解开,也锁在其中一个函数里了。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
this.notify()与notify()的运行结果是一样的,函数需要被对象调用。那么函数都有一个所属对象引用。就是this
你多试几次,就会得到你想要的这个死锁的结果了。
不过,这个例子我记得应该是notifyAll();否则肯定会出现死锁的。由于CPU切换,仅使用notify();会导致解锁不完全,有可能对方的锁并没有解开,也锁在其中一个函数里了。
回复 使用道具 举报
谢达 发表于 2013-4-6 14:00
this.notify()与notify()这是一样的吧..运行结果不会因为这里产生差别,

我这里运行有区别的,你可以复制运行下,运行时间不一样
回复 使用道具 举报
this.notify()与notify()这是一样的吧..运行结果不会因为这里产生差别,
回复 使用道具 举报
啥问题啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马