1. 程式人生 > 其它 >執行緒協作-管程法(利用緩衝區)

執行緒協作-管程法(利用緩衝區)

解決方式1
併發協作模型“生產者/消費者模式”—→管程法
生產者:負責生產資料的模組(可能是方法,物件,執行緒,程序);
消費者:負責處理資料的模組(可能是方法,物件,執行緒,程序);
緩衝區:消費者不能直接使用生產者的資料,他們之間有個“緩衝區生產者將生產好的資料放入緩衝區,消費者從緩衝區拿出資料
//測試生產者消費者模型---利用緩衝區解決:管程法
//生產者、消費者、產品、緩衝區
public class Main {
    public static void main(String[] args) {
        SynContainer container =new SynContainer();//
容器 new Procdiclor(container).start();//生產者 new Consumer(container).start();//消費者 } } //生產者 class Procdiclor extends Thread{ SynContainer container;//獲得容器 public Procdiclor(SynContainer container){ this.container=container; } //生產方法 public void run(){
for (int i=0;i<100 ;i++ ){ System.out.println("生產了---》"+i+"個產品"); container.push(new Chi(i));//呼叫緩衝區的方法來放入產品 } } } //消費者 class Consumer extends Thread{ SynContainer container;//獲得容器 public Consumer(SynContainer container){ this.container=container; }
//消費產品 public void run(){ for (int i=0;i<100 ;i++ ){ System.out.println("消費了---》"+container.pop().id+"個產品"); } } } //產品 class Chi{ int id;//u產品編號 public Chi(int id){ this.id=id; } //緩衝區 class SynContainer{ //需要一個容器大小 Chi[]chis=new Chi[10];//同時可以讓10個人消費 //容器計數器,用來判斷容器有多少 int count=0; //生產者放入產品 public synchronized void push(Chi chi){ //如果容器滿了,就要等待消費者消費 if (count==chis.length){//如果計數器等等於容器的大小,就通知消費者消費 //通知消費者,生產者等待 } //如果容器沒有滿,我們就需要丟入產品 chis[count]=chi; count++; } //可以通知消費者消費產品 } //消費者消費產品 public synchronized Chi pop(){ //判斷能否消費 if(count==0){ //等待生產者生產,消費者等待 } //如果可以消費 count--; Chi chin=chis[count];//取出產品 //通知生產者生產 return chin;//返回 } }