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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

新语新空

中级黑马

  • 黑马币:150

  • 帖子:100

  • 精华:0

本帖最后由 新语新空 于 2014-8-7 17:49 编辑

毕老师的视频里讲,如果用if判断flag可能会发生两个生产者(或者消费者)连续执行的情况,因为被唤醒的线程往下执行if语句。为什么换成while以后不是继续往下执行,而是返回判断flag呢?
而事实上,这样好像也可行。我运行过几次,确实没有出现问题。
  1. class ProduceConsumerDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Resource r = new Resource();
  6.                
  7.                 Producer pro = new Producer(r);
  8.                 Consumer con = new Consumer(r);
  9.                
  10.                 Thread t1 = new Thread(pro);
  11.                 Thread t2 = new Thread(pro);
  12.                 Thread t3 = new Thread(con);
  13.                 Thread t4 = new Thread(con);
  14.                 t1.start();
  15.                 t2.start();
  16.                 t3.start();
  17.                 t4.start();
  18.                
  19.                 //new Thread(new Producer(r)).start();
  20.                 //new Thread(new Consumer(r)).start();
  21.         }
  22. }

  23. class Resource
  24. {
  25.         private String name;
  26.         private int count = 1;
  27.         private boolean flag;
  28.         
  29.         public synchronized void set(String name)
  30.         {        
  31.                 while(flag)
  32.                         try
  33.                         {
  34.                                 wait();
  35.                         }
  36.                         catch(Exception e)
  37.                         {
  38.                         
  39.                         }
  40.                 this.name = name+"----"+count++;
  41.                
  42.                 System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
  43.                 flag = true;
  44.                 this.notifyAll();
  45.         }
  46.         
  47.         public synchronized void out()
  48.         {        while(!flag)
  49.                 {
  50.                         try
  51.                         {
  52.                                 wait();
  53.                         }
  54.                         catch(Exception e)
  55.                         {
  56.                         
  57.                         }
  58.                 }
  59.                 System.out.println(Thread.currentThread().getName()+"----消费者-----"+this.name);
  60.                 flag = false;
  61.                 this.notifyAll();
  62.         }
  63. }

  64. class Producer implements Runnable
  65. {
  66.         private Resource r;
  67.         Producer(Resource r)
  68.         {
  69.                 this.r = r;
  70.         }
  71.         
  72.         public void run()
  73.         {
  74.                 while(true)
  75.                 {
  76.                         r.set("商品");
  77.                 }
  78.         }
  79. }

  80. class Consumer implements Runnable
  81. {
  82.         private Resource r;
  83.         Consumer(Resource r)
  84.         {
  85.                 this.r = r;
  86.         }
  87.         
  88.         public void run()
  89.         {
  90.                 while(true)
  91.                 {
  92.                         r.out();
  93.                 }
  94.         }
  95. }
复制代码

1 个回复

倒序浏览
在线等,求解答!!!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马