首页 > 代码库 > 生产者消费者模式
生产者消费者模式
·生产者消费者问题,也称有限缓冲区问题,是一个多线程同步问题的经典案例。该问题描述了两个共享固体大小缓冲区的线程即“生产者”和“消费者”,生产者的主要作用是生成一定量的数据放到缓冲区,消费者消耗缓冲区的这些数据。该问题的关键是要保证生产者不会在缓冲区满的时候加入数据,消费者也不会在缓冲区为空的时候消耗数据。
·要解决该问题,就必须让生产者在缓冲区满时休眠,等到消费者消耗缓冲区中数据后,生产者才能被唤醒,开始生产数据。同样,也可以让消费者在缓冲区空时休眠,等到生产者添加数据后,再唤醒消费者
模拟电影放映 , 图片放一张 , 我们就看一张。
/* * 生产者 消费者模式 * * 信号灯: * 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(); } }
生产者消费者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。