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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 池中月 中级黑马   /  2015-7-4 22:02  /  396 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

生产者--消费者模式

1、示例:


  1. package unit18;

  2. class Resource{
  3.         private String name;
  4.         private int count = 1;
  5.         private Boolean flag = false;
  6.        
  7.         public synchronized void set(String name){
  8.                 while(flag){  //while 的巧妙使用:当wait后的线程唤醒时,判断标标记
  9.                         try {
  10.                                 this.wait();//this代表调用函数线程
  11.                         } catch (InterruptedException 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.        
  20.         public synchronized void show(){
  21.                 while(!flag){
  22.                         try {
  23.                                 this.wait();
  24.                         } catch (InterruptedException e) {
  25.                         }
  26.                 }
  27.                        
  28.                
  29.                 System.out.println(Thread.currentThread().getName()+"消费者"+ this.name);
  30.                 flag = false;
  31.                 this.notifyAll();
  32.         }
  33. }

  34. //定义生产类Producter,生产商品

  35. class Producter implements Runnable{
  36.         private Resource r;
  37.         Producter(Resource r){
  38.                 this.r = r;
  39.         }
  40.         public void run(){
  41.                 while(true){
  42.                         r.set("商品");
  43.                 }
  44.         }
  45. }

  46. //定义消费者类Customer,消费商品
  47. class Customer implements Runnable{
  48.         private Resource r;
  49.         Customer(Resource r){
  50.                 this.r = r;
  51.         }
  52.         public void run(){
  53.                 while(true){
  54.                         r.show();
  55.                 }
  56.         }
  57. }


  58. public class ProductercustomerTest {

  59.         public static void main(String[] args) {
  60.                 Resource r = new Resource();
  61.                 Producter pro = new Producter(r);
  62.                 Customer cus = new Customer(r);
  63.                 Thread t1 = new Thread(pro);
  64.                 Thread t2 = new Thread(pro);
  65.                 Thread t3 = new Thread(cus);
  66.                 Thread t4 = new Thread(cus);
  67.                 t1.start();
  68.                 t2.start();
  69.                 t3.start();
  70.                 t4.start();
  71.         }

  72. }
复制代码

分析:

  • 多个生产者、消费者定义使用while判断标记

    原因:让被唤醒的线程再次判断标记

  • 定义中使用notifyAll

    原因: 因为需要唤醒对方线程,如果使用notify容易出现值唤醒本方线程的情况,导致线程中所有线程都处于等待状态



1 个回复

倒序浏览
呵呵呵呵 。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马