スレッド割り込みメカニズムは、(協調する)スレッドに、実行中の停止要求に応答させるための推奨される方法です。すべてのスレッド(私が思うスレッド自体を含む)はinterrupt()
、スレッドを呼び出すことができます。
実際には、の通常のユースケースにinterrupt()
は、ある種のフレームワークまたはマネージャーがワーカースレッドに実行を停止するように指示することが含まれます。ワーカースレッドが「割り込み認識」である場合、例外を介して、または割り込みフラグを定期的にチェックすることにより、割り込みされたことを認識します。それが中断されたことに気付くと、行儀の良いスレッドはそれが行っていることを放棄し、それ自体を終了します。
上記のユースケースを想定すると、Javaフレームワーク内で実行された場合、または何らかのワーカースレッドから実行された場合、コードが中断される可能性があります。そして、それが中断されたとき、あなたのコードはそれがしていることを放棄し、最も適切な手段によってそれ自身を終わらせるべきです。コードの呼び出し方法によっては、これを返すか、適切な例外をスローすることで実行できます。しかし、それはおそらく呼び出すべきではありませんSystem.exit()
。(アプリケーションは、なぜ中断されたのかを必ずしも知っているわけではなく、フレームワークによって中断される必要のある他のスレッドがあるかどうかも確かに知りません。)
一方、コードが何らかのフレームワークの制御下で実行されるように設計されていない場合InterruptedException
は、これが予期しない例外であると主張する可能性があります。つまり、バグです。その場合、他のバグと同じように例外を処理する必要があります。たとえば、チェックされていない例外でラップし、他の予期しないチェックされていない例外を処理するのと同じ時点でキャッチしてログに記録します。(または、アプリケーションは単に割り込みを無視して、実行していたことを続行することもできます。)
1)自分で他のスレッドを中断したことがない場合、InterruptedExceptionをトリガーできるのは何ですか?
あなたの場合は、1つの例は、あるRunnable
オブジェクトが使用して実行されているExecutorService
とshutdownNow()
サービスに呼ばれています。そして理論的には、サードパーティのスレッドプールまたはスレッド管理フレームワークは合法的にこのようなことを行うことができます。
2)interrupt()を使用して自分で他のスレッドを中断したことがない場合...InterruptedException
それではどういう意味ですか?捕まえたらどうすればいいの?アプリをシャットダウンしますか?
コードベースを分析して、何がinterrupt()
呼び出しを行っているのか、そしてその理由を理解する必要があります。それを理解したら、アプリの>>あなたの<<部分が何をする必要があるかを理解することができます。
なぜInterruptedException
スローされているのかがわかるまでは、ハードエラーとして扱うことをお勧めします。たとえば、スタックトレースをログファイルに出力し、アプリをシャットダウンします。(明らかに、それは必ずしも正しい答えではありません...しかし、ポイントはこれが「バグ」であり、開発者/メンテナの注意を引く必要があるということです。)
3)誰が/何を呼んでいるのinterrupt()
かを知るにはどうすればよいですか?
これに対する良い答えはありません。私が提案できる最善の方法は、にブレークポイントを設定Thread.interrupt()
し、呼び出しスタックを確認することです。