プログラム悪戦苦闘日記

はてなダイアリーからの移行(遺物)

Tiger Concurrency Utilities -part2-

 
今回は同期コンテナであるBlockingQueueのはなし。

BlockingQueueインターフェイス

1.概要

「Queue」というくらいだから、java.util.Queueインターフェイスを継承している。
ブロッキングが起こるタイミングは、

  • キューが空のときに、要素を取り出す
  • キューが満杯のときに、要素を追加する

で発生する。
 
操作系のメソッドはQueueと同じで、

put(E)   要素の追加
poll()   先頭の要素を削除して、取り出す
peek()   先頭の要素を削除せずに取り出す
2.実装クラス達

BlockingQueueインターフェイスなので、実際に使うのはこいつをimplementした具象クラスだ。
いろいろあるので整理すると、

  • ArrayBlockingQueue

内部が配列によって実装されているキュー。コンストラクタで容量の最大値を指定する。

  • LinkedBlockingQueue

内部が連結リストで実装されているキュー。要素を追加すると勝手に拡張してくれる。
容量をコンストラクタで指定できるが、省略すれば(デフォルトは)Integer.MAX_VALUE (=2^31-1)になる。

  • PriorityBlockingQueue

Comparableによる順序付けした順に処理をするキュー。コンストラクタに比較方法をComparator<? super E>で指定できる。

  • DelayQueue

一定時間後に要素が取得できるようになるキュー。一定時間経たないとブロッキングされる訳ではないようだ。
でも時間はどこで指定するのだろうか?

  • SysnchronousQueue

同期キュー。要素の追加と取り出しが同期する。すなわち他方が他方を待つ。
だから要素は最大1つまでしか保持しない。つまり、

clear()          → なにもしない
contains(Object) → 常にfalse
isEmpty()        → 常にtrue
 :

となる。