Tiger Concurrency Utilities -part2-
今回は同期コンテナであるBlockingQueue
BlockingQueueインターフェイス
1.概要
「Queue」というくらいだから、java.util.Queue
ブロッキングが起こるタイミングは、
- キューが空のときに、要素を取り出す
- キューが満杯のときに、要素を追加する
で発生する。
操作系のメソッドはQueueと同じで、
put(E) 要素の追加 poll() 先頭の要素を削除して、取り出す peek() 先頭の要素を削除せずに取り出す
2.実装クラス達
BlockingQueue
いろいろあるので整理すると、
- ArrayBlockingQueue
内部が配列によって実装されているキュー。コンストラクタで容量の最大値を指定する。
- LinkedBlockingQueue
内部が連結リストで実装されているキュー。要素を追加すると勝手に拡張してくれる。
容量をコンストラクタで指定できるが、省略すれば(デフォルトは)Integer.MAX_VALUE (=2^31-1)になる。
- PriorityBlockingQueue
Comparableによる順序付けした順に処理をするキュー。コンストラクタに比較方法をComparator<? super E>で指定できる。
- DelayQueue
一定時間後に要素が取得できるようになるキュー。一定時間経たないとブロッキングされる訳ではないようだ。
でも時間はどこで指定するのだろうか?
- SysnchronousQueue
同期キュー。要素の追加と取り出しが同期する。すなわち他方が他方を待つ。
だから要素は最大1つまでしか保持しない。つまり、
clear() → なにもしない contains(Object) → 常にfalse isEmpty() → 常にtrue :
となる。