- スリープスレッドがInterruptedExceptionをキャッチするためにtrycatchが必要なのはなぜですか?
- スリープでInterruptedExceptionエラーが発生するのはなぜですか?これは私がグーグルで検索してきたJavaプログラミングで本当に知りたい2つの質問ですが、この2つのことが起こる理由についての明確な説明はまだ見つかりません。
6 に答える
スレッドがブロック/待機しているときにAnInterruptedException
がスローされ、別のスレッドによって(によってThread.interrupt
)中断されます。の欠点を被らない、即時終了の要求と考えてくださいThread.stop()
。
このように、スレッドに数年間スリープするように指示した場合でも、そのスレッドを中断することができます。
推奨される方法InterruptedException
は、がスローされたときに処理しているものをすべて中止することです。
- スレッドを中断すると、スレッドは通常の実行を完了できず、何かを実行する準備をするためにスレッドをキャッチする必要があるためです。
- 待機中のスレッドは中断されたスレッドとは異なるため、待機中のスレッドを再開できますが、中断されたスレッドはすでに実行を終了しています。
スレッドにスリープを要求すると、そのスレッドに期待される動作は、その時間だけスリープすることです。したがって、スリープが中断されると、InterruptedExceptionがスローされ、タスクを完了できなかったことを示します。そして、あなたはそれが中断された場合に何をすべきかを気にかけたいかもしれません。
割り込み例外がどのようにスローされるかについての明確な例がここにあります:http ://www.javamex.com/tutorials/threads/thread_interruption.shtml
そして、ここで議論sleep()
します:http: //www.coderanch.com/t/508657/threads/java/Sleep-Yield-stateyield()
これsleep()
は、永久に/長期間ブロックされる可能性があるため、この動作をキャンセルできる方法が必要なためです。アクションを中断したときの「通常の」完了ではないため、通知を受信しなかったというアラートの送信、リソースのクリーンアップなど、特定の補正または修復アクションを実行する必要がある場合があります。
かなり優れた開発者がいます。主題に関する作品の記事。
スリープと割り込みは意味的に関連していません。Java設計者が、スレッドをスリープ状態にしたいときは、割り込みについて思い出させる良い機会だと考えただけです。これは、デュークが「あなたは眠ろうとしているようです。また、スレッドを突然終了させる方法が必要なときに、割り込みイベントに適切に応答することを確認して、スレッドを良き市民にしたいですか?」と言っているようなものです。プロジェクトの後の段階で発生しますか?」
したがって、次のようなコードがよく見られます。
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
//Don't worry about it.
}
時々人々はこれが悪い習慣と考えられていると言います。ただし、プログラムで割り込み機能を使用する予定がない場合は、これらの例外がスローされることはないため、追加する場合は、これらの例外を処理するために追加の作業を行うかどうかを自問する必要があります。しばらくしてからプログラムの割り込み機能を使用するのは理にかなっています。これは、Java設計者が、すべてのスレッドが実行する必要があると主張したことの1つです。これは可能interrupt()
であり、実行中の処理を迅速かつクリーンに中止します。多くの場合、それは不要だと思いますが、人々はあなたのコードを見て、これを見て、それでも「ええ、悪い習慣です!」と言うでしょう。
公式のJavaチュートリアルでは、割り込みについて説明しています。基本的に、あるスレッドt
で何らかの処理を行っていて、ユーザーがそれをキャンセルしたい場合は、別のスレッドからを呼び出しますt.interrupt()
。スレッドで実行されているコードでは、s、sなどの場合t
は常に、がスローされます。これらのいずれも実行しない場合は、時々使用して中断されたかどうかを確認することもできます(すべきです)。割り込みについて知るこれらすべての方法で、それはそれがしていることを放棄し、できるだけ早くクリーンアップする必要があります。(つまり、そうする場合、この動作はあなたや誰かに役立つかもしれません—それが割り込みの考え方です。)sleep()
wait()
InterruptedException
Thread.interrupted()
したがって、Javaはこれをsleep(..)
メソッドのチェック済み例外にして、この機能の使用を検討するように強制します。理論的根拠の他の部分は、中断された場合 sleep(..)
、それは早起きするということです、そしてそれは例外的なイベントです。(ただし、 「if」があることを忘れないでください。)
重要なのは、割り込みが理由もなく発生するだけではないということです。それらを実現するためのコードを記述した場合、または他の誰かがスレッドを起動してアクティビティをキャンセルする必要がある場合に発生します。したがって、これが。Thread.sleep(..)
をスローする原因になりInterruptedException
ます。あなたがやる。そうでない場合でも、それをキャッチする必要があります。
編集。ちなみに、このようにすることをお勧めします。
try {
Thread.sleep(1000);
} catch (InterruptedException ie) {
throw new UnsupportedOperationException("Interrupts not supported.", ie);
}
したがって、あなたや他の誰かが後で誤ってこのスレッドを中断しようとした場合、彼らがそれをテストしようとすると、この機能が実装されていないことが通知されます。(UnsupportedOperationException
はのサブクラスでRuntimeException
あるため、チェックされていません。)