我想做一個 生產者 工廠 消費者的多執行緒代碼
想要實作的功能是 生產者2名 消費者2名 工廠1個
工廠在消費者消費的同時生產面包 生產數量到20個 生產者停止生產 wait睡眠,消費者在面包生產的同時消費商品 庫存到0個叫醒生產者開始生產
現在的難點是 工廠是執行緒鎖,商品不到20個的時候 2個生產者執行緒在同時競爭這個鎖來生產面包,消費者也是在同時競爭鎖來消費面包,那么問題來了,鎖只有一個,如果消費者拿去了 那么生產者就沒有鎖了 2個生產者也就無法鎖來競爭生產面包,同樣如果鎖被生產者拿去了,2個消費者也就無法競爭鎖來消費面包,我想實作的是生產者之間有一把屬于自己的鎖,消費者之間也有一把屬于自己的鎖,當生產者wait了 消費者能通過notify喚醒生產者,我是自學的,所以沒有老師 只能來論壇辛苦下大家,這樣的功能能實作嗎
uj5u.com熱心網友回復:
我覺得可以稍微調整一下你的設計你可以讓生產出來的物件定期“出庫”
就是說,剛被生產出來的面包在一個集合中
消費者不可以直接訪問這個集合
在系統定期將這個集合中的面包“出庫”轉移到另一個供消費者使用的集合中之后
消費者才可以訪問這個消費用的面包集合
這樣,瓶頸就僅僅在定期出庫轉移時會和生成者有競爭了
不過只要這個“轉移動作”足夠短,對生產的影回應該是相當小的
uj5u.com熱心網友回復:
寫一個監控執行緒,把生產者消費者的 鎖傳進去,監控執行緒while里面有兩個同步塊,第一個代碼塊 獲取生產者鎖,判斷產品是否到了20,如果到了繼續獲取消費者鎖,將生產者產品數量重置為0,消費者產品數量賦值為20,消費者鎖.notifyAll(),uj5u.com熱心網友回復:
第二個同步塊正好相反。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/108916.html
標籤:Java SE
上一篇:thymeleaf th:onclick傳遞引數 同時配置這個 href=“JavaScript:void(0)”后ajax請求無法跳轉
