我尝试用ArrayList做生产者-消费者问题,有多个生产者,多个消费者,用wait、noitify、notifyAll做并发控制。
当生产者生产完毕后,如何只notify消费者呢?
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
你確保只有消費者在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的情況。
notify被喚醒的執行緒是隨機的,所以通常是沒辦法指定是誰被喚醒。 根據我的知識水平,我認為能做的辦法有兩點: 1.設定消費者執行緒的優先級,使用notifyAll,這樣增大消費者執行緒取得資源的機率; 2.就是確保生產者執行完後,正在wait的只有消費者;
雷雷
無法指定線程,notify會喚醒等待物件的一個執行緒。
你確保只有消費者在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的情況。
notify被喚醒的執行緒是隨機的,所以通常是沒辦法指定是誰被喚醒。
根據我的知識水平,我認為能做的辦法有兩點:
1.設定消費者執行緒的優先級,使用notifyAll,這樣增大消費者執行緒取得資源的機率;
2.就是確保生產者執行完後,正在wait的只有消費者;
雷雷
無法指定線程,notify會喚醒等待物件的一個執行緒。
無法指定線程,notify會喚醒等待物件的一個執行緒。