流控思路——多消费者定量生产(第100篇)
生活随笔
收集整理的這篇文章主要介紹了
流控思路——多消费者定量生产(第100篇)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為什么80%的碼農都做不了架構師?>>> ??
多線程消費隊列到指定個數時觸發一個生產線程往隊列中補充元素,保證隊列中有足夠的數據供消費,不至于使消費線程等待,也不至于在隊列中堆得過多。假設10人消費,先放2個籃子,每個籃子10個(籃子得夠大,怎么也得夠在場的人分一次),吃完一籃子趕緊叫人再提一籃子來,誰負責叫人?吃籃子里最后一個的,或吃另外一籃第一個的,這樣得知道哪個是最后一個,哪個是第一個。另外一個方法在籃子底部放個托盤,誰拿到托盤誰負責叫人,全部消費完時,籃子里不放托盤了,按人數在籃子里放甜點,每人一份,吃完收工。
final?long?startTime?=?System.currentTimeMillis();//開始時間 int?index?=?0;//模擬處理索引 final?int?person?=?10;//模擬消費者個數final?LinkedBlockingQueue<Object>?queue?=?new?LinkedBlockingQueue<Object>(1000); /**托盤*/ class?Salver{}; /**甜點*/ class?Dessert{}; /**模擬啟動程序*/ void?start()?{/*?1、先來兩籃子?*/for?(int?k?=?0;?k?<?2;?k++)?{for?(int?i?=?0;?i?<?person;?i++)?{queue.add(++index);queue.add(new?Salver());}}/*?2、啟動消費者?*/for?(int?i?=?0;?i?<?person;?i++)?{new?Thread(new?Consumer()).start();} } /**消費者*/ class?Consumer?implements?Runnable{@Overridepublic?void?run()?{try?{while?(true)?{Object?thing?=?queue.take();if?(thing?instanceof?Salver)?{//拿到托盤,叫人再來一籃子,接著取下一個new?Thread(new?Producer()).start();continue;}?else?if?(thing?instanceof?Dessert)?{//吃完甜點收工break;}/*模擬實際處理*/System.out.println(thing);Thread.sleep(1000);}}?catch?(Exception?e)?{e.printStackTrace();}} } /**生產者*/ class?Producer?implements?Runnable?{@Overridepublic?void?run()?{try?{synchronized(Producer.class){//避免沒拿來消費完同時拿/*?消費1分鐘停止,根據實際情況調整,比如庫里沒有待處理數據或不足一籃子?*/if?(System.currentTimeMillis()?-?startTime?>?60?*?1000)?{/*?人均一份甜點?*/for?(int?i?=?0;?i?<?person;?i++)?{queue.put(new?Dessert());}}?else?{/*?加一籃子?*/for?(int?i?=?0;?i?<?person;?i++)?{queue.put(index++);}/*?放一托盤?*/queue.put(new?Salver());}}}?catch?(Exception?e)?{e.printStackTrace();}} }ps:流控思路——多生產者定量消費
轉載于:https://my.oschina.net/h2do/blog/524605
總結
以上是生活随笔為你收集整理的流控思路——多消费者定量生产(第100篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《c语言从入门到精通》看书笔记——第15
- 下一篇: 《c语言从入门到精通》看书笔记——第16