搜尋

首頁  >  問答  >  主體

多线程 - java的notify/notifyAll:如何notify指定的线程?

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

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

高洛峰高洛峰2835 天前982

全部回覆(5)我來回復

  • 黄舟

    黄舟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的情況。

    回覆
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-17 11:42:47

    notify被喚醒的執行緒是隨機的,所以通常是沒辦法指定是誰被喚醒。
    根據我的知識水平,我認為能做的辦法有兩點:
    1.設定消費者執行緒的優先級,使用notifyAll,這樣增大消費者執行緒取得資源的機率;
    2.就是確保生產者執行完後,正在wait的只有消費者;

    回覆
    0
  • 黄舟

    黄舟2017-04-17 11:42:47

    雷雷

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 11:42:47

    無法指定線程,notify會喚醒等待物件的一個執行緒。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 11:42:47

    無法指定線程,notify會喚醒等待物件的一個執行緒。

    回覆
    0
  • 取消回覆