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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

生产者和消费者问题中的notify()和notifyAll();
使用有和区别,为何notify()可以避免问题
  1. class Resource
  2. {
  3.         private String name;
  4.         private int count = 1;
  5.         boolean flag = false;
  6.         public synchronized void set(String name)
  7.         {
  8.                 while(flag)
  9.                         try{wait();}catch(Exception e){}
  10.                 this.name = name+"-----"+count++;
  11.                 System.out.println(Thread.currentThread().getName()+"-生产者--"+this.name);
  12.                 flag = true;
  13.                 this.notifyAll();
  14.         }
  15.         public synchronized void get()
  16.         {
  17.                 while(!flag)
  18.                         try{wait();}catch(Exception e){}
  19.                 System.out.println(Thread.currentThread().getName()+"消费者&&&&&&&"+this.name);
  20.                 flag = false;
  21.                 this.notifyAll();
  22.         }
  23. }
  24. class Producer implements Runnable
  25. {
  26.         private Resource r;
  27.         Producer(Resource r)
  28.         {
  29.                 this.r = r;
  30.         }
  31.        
  32.         public void run()
  33.         {
  34.                 while(true)
  35.                         r.set("商品");
  36.         }
  37. }
  38. class Consumer implements Runnable
  39. {
  40.         private Resource r;
  41.         Consumer(Resource r)
  42.         {
  43.                 this.r = r;
  44.         }
  45.        
  46.        
  47.         public void run()
  48.         {
  49.                 while(true)
  50.                         r.get();
  51.         }
  52.        
  53. }
  54. class ProducerConsumer
  55. {
  56.         public static void main(String[] args)
  57.         {
  58.                 Resource r = new Resource();
  59.                 Producer p = new Producer(r);
  60.                 Consumer c = new Consumer(r);
  61.                 Thread t1 = new Thread(p);
  62.                 Thread t2 = new Thread(p);
  63.                 Thread t3 = new Thread(c);
  64.                 Thread t4 = new Thread(c);
  65.                 t1.start();
  66.                 t2.start();
  67.                 t3.start();
  68.                 t4.start();

  69.         }
  70. }
复制代码

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马