黑马程序员技术交流社区

标题: Java基础--多线程之生产者消费者同步问题 [打印本页]

作者: michael_wlq    时间: 2015-9-11 13:57
标题: Java基础--多线程之生产者消费者同步问题
/**
*        对于多个生产者和消费者,为什么要定义while判断标记?
*        原因:让被唤醒的线程再一次判断标记。
*
*        为什么定义notifyAll()?
*        因为需要唤醒对方线程,只用notify(),容易出现只唤醒本方线程的情况,导致程序中的所有线程都等待。
*/
  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.                 while(flag)
  9.                         try{
  10.                                 wait();
  11.                         }catch(Exception e){
  12.                                
  13.                         }

  14.                 this.name = name+"--"+count++;

  15.                 System.out.println(Thread.currentThread().getName()+"...生产者.."+this.name);
  16.                 flag = true;
  17.                 this.notifyAll();
  18.         }

  19.         public synchronized void out()
  20.         {
  21.                 while(!flag)
  22.                         try{
  23.                                 wait();
  24.                         }catch(Exception e){
  25.                                
  26.                         }
  27.                 System.out.println(Thread.currentThread().getName()+"...消费者........."+this.name);
  28.                 flag = false;
  29.                 this.notifyAll();
  30.         }
  31. }

  32. class Producer implements Runnable
  33. {
  34.         private Resource res;
  35.         Producer(Resource res)
  36.         {
  37.                 this.res = res;
  38.         }
  39.         public void run()
  40.         {
  41.                 while(true)
  42.                 {
  43.                         res.set("+商品+");
  44.                 }
  45.         }
  46. }

  47. class Consumer implements Runnable
  48. {
  49.         private Resource res;

  50.         Consumer(Resource res)
  51.         {
  52.                 this.res = res;
  53.         }
  54.         public void run()
  55.         {
  56.                 while(true)
  57.                 {
  58.                         res.out();
  59.                 }
  60.         }
  61. }

  62. class ProducerConsumerDemo
  63. {
  64.         public static void main(String[] args)
  65.         {
  66.                 Resource r = new Resource();

  67.                 Producer pro = new Producer(r);
  68.                 Consumer con = new Consumer(r);

  69.                 Thread t1 = new Thread(pro);
  70.                 Thread t2 = new Thread(pro);
  71.                 Thread t3 = new Thread(con);
  72.                 Thread t4 = new Thread(con);

  73.                 t1.start();
  74.                 t2.start();
  75.                 t3.start();
  76.                 t4.start();

  77.         }
  78. }
复制代码









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