首页 > 代码库 > 生产者消费者模式

生产者消费者模式

·生产者消费者问题,也称有限缓冲区问题,是一个多线程同步问题的经典案例。该问题描述了两个共享固体大小缓冲区的线程即“生产者”和“消费者”,生产者的主要作用是生成一定量的数据放到缓冲区,消费者消耗缓冲区的这些数据。该问题的关键是要保证生产者不会在缓冲区满的时候加入数据,消费者也不会在缓冲区为空的时候消耗数据。

·要解决该问题,就必须让生产者在缓冲区满时休眠,等到消费者消耗缓冲区中数据后,生产者才能被唤醒,开始生产数据。同样,也可以让消费者在缓冲区空时休眠,等到生产者添加数据后,再唤醒消费者

 

模拟电影放映 , 图片放一张 , 我们就看一张。

/*
 * 生产者 消费者模式
 * 
 * 信号灯:  
 * flag  T 生产者生产 消费者等待 生产完毕后通知消费者消费
 *          F 消费者消费 生产者等待 消费完毕后通知生产者生产
 */
public class Movie {
    private String pic;
    private boolean flag = true;
    public synchronized void play(String pic) {
        if(!flag){
            try {
                this.wait();             // 当前线程停止
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //开始生产
        System.out.println("生产了 "+pic);
        this.pic = pic;
        //生产完毕
        
        this.notify(); // 唤醒消费者线程
        this.flag  = false;
    }
    
    public  synchronized void  watch(){
        if(flag){
            try {
                this.wait();             // 当前线程停止
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        // 开始消费
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("消费了"+ pic);
        //消费完毕
        this.notify();  //通知生产
        this.flag = true ;
    }

}
package rimon.zheng.thread;

public class Player implements Runnable{
    private Movie temp ;
    
    
    public Player(Movie temp) {
        
        this.temp = temp;
    }


    public  void run() {
        for(int i=0;i<20;i++){            
            if(0==i%2){
                temp.play("左");                                        
            }else{
                temp.play("右");
            }    
        }
    }
}
package rimon.zheng.thread;

public class Watcher implements Runnable{
    private Movie m ;

    public Watcher(Movie m) {
        super();
        this.m = m;
    }
    @Override
    public  void run() {
        for(int i=0;i<20;i++){
            m.watch();
        }
        
    }
    
}
public class App {
    public static void main(String[] args) {
        Movie m = new Movie();
        Thread t1 = new Thread(new Player(m));
        
        Thread t2 = new Thread(new Watcher(m));
        t1.start();
        t2.start();
    }
}

 

生产者消费者模式