Java多執行緒-BlockingQueue(阻塞佇列)
前言:
BlockingQueue是多執行緒安全的佇列,它有兩種常見的阻塞場景。
- 佇列中沒有資料的情況下,消費者端的所有執行緒都會被自動阻塞(掛起),直到有資料放入佇列。
- 當佇列中填滿資料的情況下,生產者端的所有執行緒都會被自動阻塞(掛起),直到佇列中有空的位置,執行緒被自動喚醒。
BlockingQueue核心方法:
- 拋異常:如果試圖的操作無法立即執行,拋一個異常
- 特定值:如果試圖的操作無法立即執行,返回一個特定的值(常常是 true / false)
- 阻塞:如果試圖的操作無法立即執行,該方法呼叫將會發生阻塞,直到能夠執行
- 超時:如果試圖的操作無法立即執行,該方法呼叫將會發生阻塞,直到能夠執行,但等待時間不會超過給定值。返回一個特定值以告知該操作是否成功(典型的是 true / false)
注意:
- BlockingQueue中無法放入null值(會丟擲NullPointerException異常)。
- 可以訪問BlockingQueue中的所有元素並對其進行相關操作,但需要注意的是,除了對對頭和對尾外,獲取其他元素的效率並不高(鑑於佇列的特徵)。
- 可以限定BlockingQueue的容量,也可以不限定。
- BlockingQueue是個介面,java.util.concurrent提供了一些BlockingQueue的子類,當然你也可以實現自己的子類。