1. 程式人生 > >第三章:執行緒間通訊

第三章:執行緒間通訊

  1. 一句話總結wait和notify: wait使執行緒停止執行, 而notify使停止的執行緒繼續執行。

  2. wait()執行後,執行緒進入等待執行緒佇列,釋放鎖。notify()執行後,並不立即釋放鎖,後面語句要執行完才釋放。 關鍵字synchronized可以將任何一個Object作為同步物件看待,JAVA為每一個Object都實現了wait()和notify() 方法。 wait()和notify() 必須用在synchronized的同步區類。 notify() 方法可以隨機喚醒等待佇列中等待同一共享資源的“一個”執行緒,使該執行緒退出等待佇列,進入可執行狀態。 notifyAll()方法可以使所有正在等待同一共享資源的“全部”執行緒從等待狀態退出,進入可執行狀態。

  3. 每個鎖物件都有兩個佇列,一個是就緒佇列,一個是阻塞佇列。

  4. sleep()和wait() 的區別 a, sleep() 方法是Thread類中的方法, wait()是Object類中的方法 b, sleep() 不釋放鎖。

  5. wait()和notify() 最常用於 生產者和消費者模式實現。 在一個生產者和一個消費者時,是沒有問題的。 但是在多個生產者和 多個消費者時就很可能出現 “假死” 的現象。 即所有的執行緒都處於WAITING狀態。 因為all用的都是同一把鎖, notify不能保證喚醒是異類,也許是同類。 生產者喚醒生產者… 解決方案超級簡單, 把生產者和消費者中所有的notify()都改成notifyAll()

  6. 一個生產者 對 多個消費者 進行棧操作 很可能出現異常。 問題在於if語句作為條件判斷,因為條件發生改變時沒有得到及時的響應。將if改成while,但是會 出現新的問題—假死—> 改成notifyAll();

  7. 用管道流進行執行緒間的通訊:位元組流 PipeInputStream 和 PipeOutputStream.最主要是把輸入流和輸出流聯絡起來。 outputStream.connect(inputStream)

  8. join 的作用是等待執行緒物件銷燬。 join(long) 和 sleep(long)的區別:(都是等多久的事兒) a, join(long)的功能在內部使用wait(long) 方法來實現, 所以具有釋放鎖的特點。 sleep(long) 是不會釋放鎖的。

  9. join() 後面的程式碼提前執行:解釋意外 這個直接沒看懂,先pass掉。

  10. 所有的執行緒都使用同一個變數值 public static。 如果要實現每一個執行緒都有自己的共享變數值:ThreadLocal. ThreadLocal解決的是變數在不同執行緒間的隔離性,也就是說不同的執行緒擁有自己的值。