「増補改訂版 Java言語で学ぶデザインパターン入門 マルチスレッド編」第四章『Balking』読了

第四章『Balking』パターンを読み終わった.ガード条件が満たされていない場合には処理を途中でやめる,一定時間たっても処理が行われなければ中断する,などようやくマルチスレッドプログラミングっぽくなってきた.

java.util.concurrent.LinkedBlockingQueue

タイムアウト処理を行う場合,wait () を使って処理を待ち,System.currentTimeMills () で取得した経過時間による条件分岐によって,例外処理を throw するなどして実現していた.

しかし java.util.concurrent.LinkedBlockingQueue を使えばもっと手軽にタイムアウト処理を行うことができる.
(158~159 ページ,507~508 ページ)

例えば,キューから要素を取り出す poll メソッドの場合,以下のような使い方ができる.

result = queue.poll ( 30L, TimeUnit.SECONDS );

こう書くと,30 秒以内に要素が得られなかった場合には result に null を返す.

また,キューを追加する offer メソッドでは,

result = queue.offer ( request, 30L, TimeUnit.SECONDS );

とかくと,30 秒以内に要素が追加できなければ false を返す.

一つのスレッドを何度も start () すると

これは1度だけ実行できる.

start メソッドが再度呼び出された場合には,スレッドの起動が二度と起こらないように balk して,例外 IllegalThreadStateException を投げます
(508 ページから引用)

つまり Thread クラスの start メソッドでも balking パターンが使用されている.