zoukankan      html  css  js  c++  java
  • 生产者---消费者问题

    一、管程法

    /**
     * 并发协作模型:生产者消费者实现方式:管程法
     * 借助缓冲区
     * @author DARK
     *
     */
    public class CoTest01 {
    	public static void main(String[] args) {
    		SynContainer container=new SynContainer();
    		
    		new Productor(container).start();
    		new Consumer(container).start();
    	}
    }
    //生产者
    class Productor extends Thread{
    	SynContainer container;
    	public Productor(SynContainer container) {
    		this.container = container;
    	}
    	//生产
    	@Override
    	public void run() {
    		for(int i=1;i<100;i++) {
    			System.out.println("生产"+i+"个馒头");
    			container.push(new SteamedBun(i));
    		}
    	}
    }
    //消费者
    class Consumer extends Thread{
    	SynContainer container;
    	public Consumer(SynContainer container) {
    		this.container = container;
    	}
    	//消费
    	@Override
    	public void run() {
    		for(int i=1;i<100;i++) {
    			System.out.println("消费"+container.pop().id+"个馒头");
    		}
    	}
    }
    //缓冲区
    class SynContainer{
    	SteamedBun[] buns=new SteamedBun[10];//存储数据容器
    	int count=0;//计数器
    	//存储 生产
    	public synchronized void push(SteamedBun bun) {
    		//何时能生产 容器存在空间
    		if(count==buns.length) {
    			try {
    				this.wait();//线程阻塞。消费者通知生产解除
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		buns[count]=bun;
    		count++;
    		this.notifyAll();//有数据 唤醒消费
    	}
    	//获取 消费
    	public synchronized SteamedBun pop() {
    		//何时消费 容器中是否存在数据
    		//有数据 消费,无数据 等待
    		if(count==0) {
    			try {
    				this.wait();//线程阻塞。生产者通知消费解除
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		count--;
    		SteamedBun bun=buns[count];
    		this.notifyAll();//有空间 唤醒生产
    		return bun;
    	}
    }
    //数据
    class SteamedBun{
    	int id;
    	public SteamedBun(int id) {
    		this.id = id;
    	}
    }
    

    二、信号灯法

    /**
     * 生产者消费者模式  信号灯法
     * 借助标志位
     * @author DARK
     *
     */
    public class CoTest02 {
    	public static void main(String[] args) {
    		Tv tv=new Tv();
    		
    		new Actor(tv).start();
    		new Watcher(tv).start();
    	}
    }
    //生产者 演员
    class Actor extends Thread{
    	Tv tv;
    	public Actor(Tv tv) {
    		this.tv=tv;
    	}
    	@Override
    	public void run() {
    		for(int i=0;i<20;i++) {
    			if(i%2==0) {
    				tv.play("奇葩说");
    			}else {
    				tv.play("吐槽大会");
    			}
    		}
    	}
    }
    //消费者 观众
    class Watcher extends Thread{
    	Tv tv;
    	public Watcher(Tv tv) {
    		this.tv=tv;
    	}
    	@Override
    	public void run() {
    		for(int i=0;i<20;i++) {
    			tv.listen();
    		}
    	}
    }
    //同一个资源 电视
    class Tv{
    	String voice;
    	//信号灯 T:演员表演,观众等待 F:观众观看,演员等待
    	boolean flag=true;
    	//表演
    	public synchronized void play(String voice) {
    		//演员等待
    		if(!flag) {
    			try {
    				this.wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		//表演时刻
    		System.out.println("表演了:"+voice);
    		this.voice=voice;
    		this.notifyAll();
    		//切换标志
    		this.flag=!this.flag;
    	}
    	//观看
    	public synchronized void listen() {
    		//观众等待
    		if(flag) {
    			try {
    				this.wait();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    		//观看时刻
    		System.out.println("听到了:"+voice);
    		this.notifyAll();
    		//切换标志
    		this.flag=!this.flag;
    	}
    }
    

      

  • 相关阅读:
    383. Ransom Note
    598. Range Addition II
    453. Minimum Moves to Equal Array Elements
    492. Construct the Rectangle
    171. Excel Sheet Column Number
    697. Degree of an Array
    665. Nondecreasing Array
    视频网站使用H265编码能提高视频清晰度吗?
    现阶段的语音视频通话SDK需要解决哪些问题?
    企业远程高清会议平台视频会议系统在手机端使用的必备要求有哪些?
  • 原文地址:https://www.cnblogs.com/firecode7/p/13431729.html
Copyright © 2011-2022 走看看