【Java】割込例外 InterruptedException について考える

■ はじめに

 * 割込例外 InterruptedException は、他の例外とは少し毛色が違った例外なので、
   少し考えを整理する

■ 割込例外 InterruptedException

http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000386.html
より抜粋

 * 割り込みが発生した場合に投げられる例外。 

■ 割込に対する考え方

https://www.ibm.com/developerworks/jp/java/library/j-jtp05236/index.html
より抜粋

 * 別のスレッドに対して、「できれば、実行中の処理を都合のよいときに停止してください」と、
   ていねいにお願いする手段

  => 割込例外が起こっても、現在行っている処理を必ずしも中断して、例外に応じなくてもいい
  => ただし、無視すると、処理が遅くなる
割込みを受けつけた方がいい場合
【例】
大量のデータを出力しようとした場合、プログレスバーとキャンセルボタンがあり、
ユーザがキャンセルボタンを押して、中断した時

■ タスクの分類

[1] キャンセル可能タスク
[2] キャンセル不能タスク

[1] キャンセル可能タスク

 * そのまま割込例外 InterruptedException を投げればいい

[2] キャンセル不能タスク

 * 割り込みを単に無視・拒否しないで実装の仕方を考える(以下のサンプル参照)
サンプル
boolean isInterrupted = false;
try {
  // 無限ループを使って必ず処理を終わらせる
  while (true) {
    try {
      // ・・・必ず終わらせたい処理
      return;
    } catch (InterruptedException ex) {
      // !!割込発生!! => フラグを立てて再実行
      isInterrupted = true;
      // fall through and retry
    }
  }
} finally {
  // 割込が発生していたら、割込があったことを現在のメインスレッドに伝える
  if (isInterrupted) {
    Thread.currentThread().interrupt();
  }
}