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

読了.補講 1 の InterruptedException が意味するところや,wait, sleep, join の違いはしっかり覚えておきたい.

InterruptedException の意味合い

プログラムの中で InterruptedException が投げられる可能性があるメソッドには以下のような特徴がある.

・「時間がかかる」メソッドである.
・「キャンセルできる」メソッドである.
一言で言えば,throws InterruptedException がついためそっどは,時間はかかるかもしれないが,キャンセルできるメソッドなのです.
(179 ページより引用)

なかでも,標準クラスライブラリ中で throws InterruptedException が付いているメソッドは,
・wait (notify/notifyAll されるまで待つ,notify/notifyAll で待つのをキャンセル)
・sleep (引数で指定された時間待つ.指定時間が経つとキャンセル)
・join (指定したスレッドの終了を待つ.別スレッドの終了を待つのをキャンセル)
だそうである.

interrupt メソッドにおける sleep メソッドと wait メソッドの扱いの違い

sleep メソッドを途中でキャンセルする場合には interrupt メソッドを使用する.このメソッドを使用すると InterruptedException が投げられる.その際, Thread のインスタンスメソッドとして interrupt メソッドを使うのだが,そのインスタンスのロックを取る必要はない,どのスレッドでも自由に interrupt メソッドを呼び出すことができる.

一方,wait メソッドでは wait メソッドを使用した際にスレッドは一度ロックを開放しウェイトセットに入っているので,再びロックを取り直してからでないと投げることができない.

interrupt メソッドの機能

interrupt メソッドは直接 InterruptedException を投げているわけではない.このメソッドは,単に非インタラプト状態からインタラプト状態に変更するだけのインスタンスメソッドである.仮に interrupt メソッドが呼び出されたあとに通常の処理が書かれていた場合,その時点で中断するわけではなくそのまま処理を続行する.その後 sleep, wait, join メソッドなどが呼び出されるか,明示的に InterruptedException を投げるかしない限り,例外処理は行われない.