我尝试用ArrayList做生产者-消费者问题,有多个生产者,多个消费者,用wait、noitify、notifyAll做并发控制。
当生产者生产完毕后,如何只notify消费者呢?
黄舟2017-04-17 11:42:47
你確保只有消費者在wait,這樣notify就只會通知消費者了。
話說為什麼要讓生產者去wait呢?
為佇列加一個鎖定lock,然後建立兩個Condition,一個是full,處理佇列滿的情況;另一個是empty,處理佇列空的情況。
操作流程是這樣的:
生產者:
1、獲得鎖
2.檢查佇列是否滿,如果滿則等待full condition,直到被消費者喚醒
3、將元素加入隊列
4、notify empty condition,喚醒一個消費者
5、釋放鎖
消費者:
1、獲得鎖
2.檢查佇列是否空,如果空則等待empty condition,直到被生產者喚醒
3.從隊列中取出一個元素
4、notify full condition,喚醒一個生產者
5、釋放鎖。
牢記一點,Condition不是鎖,不存在「鎖定」Condition的情況。
伊谢尔伦2017-04-17 11:42:47
notify被喚醒的執行緒是隨機的,所以通常是沒辦法指定是誰被喚醒。
根據我的知識水平,我認為能做的辦法有兩點:
1.設定消費者執行緒的優先級,使用notifyAll,這樣增大消費者執行緒取得資源的機率;
2.就是確保生產者執行完後,正在wait的只有消費者;