多线程 - java的notify/notifyAll:如何notify指定的线程?
高洛峰
高洛峰 2017-04-17 11:40:47
0
5
990

我尝试用ArrayList做生产者-消费者问题,有多个生产者,多个消费者,用wait、noitify、notifyAll做并发控制。

当生产者生产完毕后,如何只notify消费者呢?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(5)
黄舟

你確保只有消費者在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會喚醒等待物件的一個執行緒。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板