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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 630681386@qq.co 中级黑马   /  2014-2-9 14:49  /  1500 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. /*多线程 等待唤醒机制中的经典案例,生产者和消费者的问题*/
  2. class Resrour//共享资源
  3. {
  4.         private String name;
  5.         private int a=1;
  6.         private boolean flag=false;
  7.         public synchronized void set(String name)
  8.         {
  9.                 while(flag)
  10.                         try{this.wait();}catch(InterruptedException e){}
  11.            this.name= name + a;
  12.           a++;
  13.            System.out.println(Thread.currentThread().getName()+"..生产者生产了...."+name);
  14.     [color=Red]我就是奇怪,这里为什么不输出编号[/color]
  15.            flag=true;//存完值后更改标记变量
  16.             notify();//唤醒读取线程
  17.         }
  18.         public synchronized void out()
  19.         {
  20.                 while(!flag)
  21.                         try{this.wait();}catch(InterruptedException e){}
  22.            System.out.println(Thread.currentThread().getName()+"..消费者消费了........"+name);
  23.             flag=false;
  24.             notify();
  25.         }
  26. }
  27. //生产者线程任务
  28. class Producer implements Runnable
  29. {
  30.         private Resrour r;
  31.     Producer(Resrour r)
  32.         {
  33.           
  34.           this.r=r;
  35.         }
  36.         public void run()
  37.         {
  38.                 while(true)
  39.                 {
  40.                   r.set("烤鸭");
  41.                 }   
  42.         }
  43. }
  44. //消费者线程任务
  45. class Consumer implements Runnable
  46. {
  47.         private Resrour r;
  48.     Consumer(Resrour r)
  49.         {
  50.           this.r=r;
  51.         }
  52.         public void run()
  53.         {
  54.                 while(true)
  55.                 {
  56.                   r.out();
  57.                 }
  58.         }
  59. }

  60. class  ThreadDemo3
  61. {
  62.         public static void main(String[] args)
  63.         {
  64.                 Resrour r=new Resrour();
  65.        Producer pr=new Producer(r);
  66.            Consumer co=new Consumer(r);
  67.            Thread t0=new Thread(pr);
  68.            Thread t1=new Thread(pr);
  69.            Thread t2=new Thread(co);
  70.            Thread t3=new Thread(co);
  71.            t0.start();
  72.            t1.start();
  73.            t2.start();
  74.            t3.start();
  75.         }
  76. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

3 个回复

倒序浏览
这个问题涉及到变量的作用于问题
输出编号的name是类Resrour的成员变量
在java中,在成员函数内如果有变量名和成员变量名相同,函数会优先调用自身定义或者收到的参数,若无才会去类的成员变量中去寻找。想直接调用类的成员变量,此时就要把成员变量就要加this给与区分
this.name(指的是类的成员变量)= name(方法的参数) + a;
System.out.println(Thread.currentThread().getName()+"..生产者生产了...."+name(使用this.name替换name即可,));

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

回复 使用道具 举报
死锁了
将notify()改成notifyAll()就好了

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
System.out.println(Thread.currentThread().getName()+"..生产者生产了...."+name); 这个name是set方法传参传进来的name,你并没有把这个参数加上编号,自然不能打印出编号了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马