黑马程序员技术交流社区

标题: 请大神帮我看看这个,关于线程间通信-生产者和消费者的例子 [打印本页]

作者: Ezreal    时间: 2014-8-2 17:45
标题: 请大神帮我看看这个,关于线程间通信-生产者和消费者的例子
为什么我的运行结果是 Thread-0---生产者+商品+...1
后面就没了  运行了好多次都是这样 到底是哪里出问题了啊??

  1. class Goods{
  2.          private String name;
  3.          private int num = 1;
  4.          private boolean flag = false;
  5.          public synchronized void set(String name)
  6.          {
  7.                 while(flag)
  8.                          try{this.wait();}catch(Exception e){}
  9.                  this.name = name+"..."+num++;
  10.                  System.out.println(Thread.currentThread().getName()+"---生产者"+this.name);
  11.                  flag = true;
  12.                  this.notifyAll();
  13.          }
  14.          public synchronized void out()
  15.          {
  16.                  while(flag)
  17.                          try{this.wait();}catch(Exception e){}
  18.                  System.out.println(Thread.currentThread().getName()+"------消费者"+this.name);
  19.                  flag = false;
  20.                  this.notifyAll();
  21.          }
  22. }
  23. class Producer implements Runnable {
  24.          private Goods g;
  25.          Producer(Goods g)
  26.          {
  27.                 this.g = g;
  28.          }
  29.          public void run()
  30.          {
  31.                 while(true)
  32.                 {
  33.                         g.set("+商品+");
  34.                 }
  35.          }
  36. }
  37. class Consumer implements Runnable{
  38.          private Goods g;
  39.         Consumer(Goods g)
  40.          {
  41.                 this.g = g;
  42.          }
  43.         public void run()
  44.         {
  45.                 while(true)
  46.                 {
  47.                         g.out();
  48.                 }
  49.         }
  50. }
  51. class ProducerConsumerDemo {
  52.         public static void main(String[] args)
  53.         {
  54.                 Goods g = new Goods();
  55.                 Producer pro = new Producer(g);
  56.                 Consumer con = new Consumer(g);
  57.                 Thread t1 = new Thread(pro);
  58.                 Thread t2 = new Thread(pro);
  59.                 Thread t3 = new Thread(con);
  60.                 Thread t4 = new Thread(con);
  61.                 t1.start();
  62.                 t2.start();
  63.                 t3.start();
  64.                 t4.start();
  65.         }
复制代码

作者: fantacyleo    时间: 2014-8-2 17:49
生产者和消费者都是flag==true时wait,肯定挂了,四个线程都wait了,没一个醒的
作者: Ezreal    时间: 2014-8-2 17:58
fantacyleo 发表于 2014-8-2 17:49
生产者和消费者都是flag==true时wait,肯定挂了,四个线程都wait了,没一个醒的 ...

完了,while(flag)这里写错了   应该是while(!flag)的  真是无语了{:3_48:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2