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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐传任 中级黑马   /  2012-10-17 20:44  /  1141 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Resource
  2. {
  3.         private String name;
  4.         private int count = 1;
  5.         private boolean flag = false;
  6.         public synchronized void set(String name)
  7.         {
  8.                 if(flag) {
  9.                         try{this.wait();}catch(InterruptedException e){}
  10.                 } else {//老师讲的是用while来判断防止生产一个消费多个的问题,我这样用if else 来判断是不是也可以也不会出现安全问题               
  11.                         this.name = name + count;
  12.                         count++;
  13.                         System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
  14.                         flag = true;
  15.                         notifyAll();
  16.                 }
  17.         }

  18.         public synchronized void out()//  t3
  19.         {
  20.                 if(!flag) {
  21.                         try{this.wait();}catch(InterruptedException e){}
  22.                 }else {
  23.                         System.out.println(Thread.currentThread().getName()+"...消费者........"+this.name);
  24.                         flag = false;
  25.                         notifyAll();
  26.                 }
  27.         }
  28. }

  29. class Producer implements Runnable
  30. {
  31.         private Resource r;
  32.         Producer(Resource r)
  33.         {
  34.                 this.r = r;
  35.         }
  36.         public void run()
  37.         {
  38.                 while(true)
  39.                 {
  40.                         r.set("烤鸭");
  41.                 }
  42.         }
  43. }

  44. class Consumer implements Runnable
  45. {
  46.         private Resource r;
  47.         Consumer(Resource r)
  48.         {
  49.                 this.r = r;
  50.         }
  51.         public void run()
  52.         {
  53.                 while(true)
  54.                 {
  55.                         r.out();
  56.                 }
  57.         }
  58. }



  59. class  ProducerConsumerDemo
  60. {
  61.         public static void main(String[] args)
  62.         {
  63.                 Resource r = new Resource();
  64.                 Producer pro = new Producer(r);
  65.                 Consumer con = new Consumer(r);

  66.                 Thread t0 = new Thread(pro);
  67.                 Thread t1 = new Thread(pro);
  68.                 Thread t2 = new Thread(con);
  69.                 Thread t3 = new Thread(con);
  70.                 t0.start();
  71.                 t1.start();
  72.                 t2.start();
  73.                 t3.start();

  74.         }
  75. }

复制代码
我这样用if else是不是也可以避免出现生产一个消费多个的问题,自己写的时候这样写了感觉应该也没问题,不大肯定,帮忙看看,谢谢

评分

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

查看全部评分

1 个回复

正序浏览
//老师讲的是用while来判断防止生产一个消费多个的问题,我这样用if else 来判断是不是也可以也不会出现安全问题
这个问题,最好用while语句,while语句能防止伪唤醒的情况。伪唤醒发生的定义是一个线程不是被别的线程唤醒、不是被别的线程中断、或者超时,而被唤醒叫做伪唤醒。至于想具体了解什么是伪唤醒,自己可以查查文档,也可以看看张孝祥讲的jdk1.5的线程并发库的视频第4课31分钟开始看,里面有讲过。我的理解采用了老张的说法,就是你睡着了,可能不是你被别人叫醒的,有可能你是被噩梦惊醒的。

点评

很好。谢谢  发表于 2012-10-18 10:09
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马