併發協作模型生產者消費者模式的第一種管程法,它的核心要點是加了緩衝區,有了緩衝區之後,生產者和消費者之間解耦了,比如超市的中間商,生產者向中間商發商品,超市向中間商進商品,而生產者並不知道商品買給誰了。
分析這個模型有幾個角色:
第乙個角色生產者,第二個角色消費者,它們兩個是多執行緒,第三個是併發容器也就是緩衝區,第四個資料,比如漢堡。生產者往裡面填資料,消費者往外面拿資料,所以緩衝區的併發操作存或取。當緩衝區裡面的資料是滿的,生產者就等待,
當緩衝區沒滿就生產。當緩衝區裡面有資料的時候,消費者就可以消費了,當緩衝區裡面為空的時候就等待。
object類提供的wait表示執行緒等待,notifyall喚醒第乙個處於等待的執行緒,ontifyall表示喚醒所有執行緒
看案例
package com.cb.thread.day05;
/* * 協作模型:生產者消費者實現一;管程法
*/public class cotest01
}//生產者
class producor extends thread
} public producor(synconsumer consumer) }
//消費者
class consumer extends thread
} public consumer(synconsumer consumer)
}//緩衝區
class synconsumer catch (interruptedexception e)
} //存在空間 可以生產
hamburgers[count] = hamburger;
count++;
//存在資料了,可以通知消費者消費了
this.notifyall();
} //獲取
public synchronized chickenhamburger pop() catch (interruptedexception e)
}//存在資料可以消費
count--;
chickenhamburger hanhamburger = hamburgers[count];
this.notifyall();//存在空間了,可以喚醒生產者生產了
return hanhamburger; }}
//資料:雞腿堡
class chickenhamburger;
}
執行結果:注釋寫的很清楚,何時生產,當容器有空間了,就可以生產,
當容器滿了,生產者等待。何時消費,當容器有資料了就可以消費,當容器沒有資料就等待。還有就是當生產者往容器生產資料時,就通知消費者消費,也就是喚醒執行緒;當消費者處理資料,就喚醒生產者生產者消生產資料。
接下來第二種生產者消費者模式------->訊號燈法
接下來模擬我們看電視,演員演什麼,觀眾看什麼,當演員演戲的時候,觀眾等待,當我們看的時候,演員等待。
package com.cb.thread.day05;
/* * 協作模型:生產者消費者實現二; 訊號燈法
* 借助標誌位
*/public class cotest02
}//生產者 演員
class player extends thread
public void run() else
} }}//消費者 觀眾
class watcher extends thread
public void run()
}}//同乙個資源 電視
class tv catch (interruptedexception e)
} //表演時刻
system.out.println("表演了:"+voice);
this.voice = voice;
//表演結束,喚醒觀眾
this.notify();
//切換標誌
this.flag=!this.flag;
}//**
public synchronized void watch() catch (interruptedexception e)
} //**
system.out.println("聽到了:"+ voice);
//**結束,喚醒演員
this.notify();
//切換標誌
this.flag= !this.flag;
}}
執行結果:
執行緒 執行緒協作 管程法
wait 讓執行緒堵塞 notifyall 通知執行緒接觸堵塞mq 的思想,列 生產者生產,消費者消費,通過緩衝區 生產者生產100個摸頭,消費者買饅頭。消費者從緩衝區取饅頭,如果饅頭已賣完,就進入等待,等生產者做饅頭,放到容器裡,再通知消費者取饅頭,如果生產者已經再容器裡生產100個 則 進入等待...
多執行緒(管程法)
管程法 什麼是管程法?就是併發協作模型 生產者 消費者模式 實現方式的一種。思想 1.首先需要四個角色 1.生產者2.消費者3.緩衝區4.饅頭 2.生產者生產饅頭放到緩衝區,緩衝區如果滿了,生產者停止運作,進入等待 3.消費者從緩衝區拿饅頭,如果緩衝區饅頭沒有了,先喚醒生產者,然後進入等待 協作模型...
多執行緒25 管程法
利用快取區存放資料 package com.faq.gaoji 測試 生產者消費者模型 利用緩衝區解決 管程法 生產者 消費者 產品 緩衝區 public class testpc 生產者 class productor extends thread 生產 override public void ...