生产者消费者模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了生产者消费者模式相关的知识,希望对你有一定的参考价值。
·生产者消费者问题,也称有限缓冲区问题,是一个多线程同步问题的经典案例。该问题描述了两个共享固体大小缓冲区的线程即“生产者”和“消费者”,生产者的主要作用是生成一定量的数据放到缓冲区,消费者消耗缓冲区的这些数据。该问题的关键是要保证生产者不会在缓冲区满的时候加入数据,消费者也不会在缓冲区为空的时候消耗数据。
·要解决该问题,就必须让生产者在缓冲区满时休眠,等到消费者消耗缓冲区中数据后,生产者才能被唤醒,开始生产数据。同样,也可以让消费者在缓冲区空时休眠,等到生产者添加数据后,再唤醒消费者
模拟电影放映 , 图片放一张 , 我们就看一张。
/* * 生产者 消费者模式 * * 信号灯: * 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(); } }
以上是关于生产者消费者模式的主要内容,如果未能解决你的问题,请参考以下文章