24

Java のInterruptedExceptionに関する興味深い質問と回答があります。たとえば、The Cause of InterruptedExceptionHandling InterruptedException in Javaなどです。ただし、どれも InterruptedException の考えられる原因について教えてくれません。

SIGTERM、SIGQUIT、SIGINT などの OS シグナルはどうですか? コマンド ラインで CTRL-C を押すと、InterruptedException が発生しますか? ほかに何か?

4

1 に答える 1

33

あなたがリストしたものはどれもInterruptedException.

スレッドを中断できるのは、への呼び出しだけですThread#interrupt()。JLS は、セクション 17.2.3から、この問題について比較的明確です。

17.2.3 中断

の呼び出し時に割り込みアクションが発生しThread.interrupt、 などのメソッドを順番に呼び出すように定義されていThreadGroup.interruptます。

詳細については、割り込みに関する公式チュートリアルも参照してください。具体的には:

interruptスレッドは、スレッドが中断されるThreadオブジェクトを呼び出すことによって、割り込みを送信します。割り込みメカニズムが正しく機能するには、割り込みを受けたスレッドが独自の割り込みをサポートしている必要があります。

...

割り込みメカニズムは、割り込みステータスと呼ばれる内部フラグを使用して実装されます。呼び出すとThread.interrupt、このフラグが設定されます。スレッドが静的メソッドを呼び出して割り込みをチェックするとThread.interrupted、割り込みステータスがクリアされます。あるスレッドが別のスレッドの割り込みステータスを照会するために使用する非静的isInterruptedメソッドは、割り込みステータス フラグを変更しません。

慣例により、 をスローして終了するメソッドは、そのInterruptedExceptionときに割り込みステータスをクリアします。ただし、別のスレッドが呼び出すことによって、割り込みステータスがすぐに再度設定される可能性は常にありますinterrupt

interrupt()これは、他の未知の外部イベントによってトリガーされるのではなく、を呼び出すことによってのみ設定可能な明示的なフラグであることを意味します。これは、たとえば、それをスローするさまざまなメソッドの例外の説明によってさらに暗示されます(私の強調):

InterruptedException-いずれかのスレッドが現在のスレッドを中断した場合。この例外がスローされると、現在のスレッドの中断ステータスがクリアされます。


割り込みシステムの一般的な目的は、スレッドが他のスレッドのタスク (潜在的に時間のかかるタスク) に割り込みできるようにするための、明確に定義された共通のフレームワークを提供することです。独自のアプリケーションで明示的なロジックを使用して同様の機能を実装することもできますが、この明確に定義されたメカニズムを使用すると、独立したクラス (JDK、他のサードパーティ コード、独自のコード内の他の独立したクラスなど) がこの機能を一貫した方法で提供できます。 .

取り扱いに関する多くの注意事項や「警告」はInterruptedException、それらが完全に自発的に投げられることを意味するものではありませんinterrupt()。つまり、将来の状況で堅牢な再利用可能なオブジェクトを作成している場合、それらが自発的にスローされる可能性があると想定たいのです。作業を中断します)。

迅速な 1 回限りのプロジェクトでは、これらの例外の特別な処理について心配する必要はありませんinterrupt()ただし、 を呼び出していないこと、および を呼び出すことができるものを呼び出していないことが確実にわかっている限りinterrupt()、ただし、の意味に注意してください。長期的には、特にそのコードを他のコンテキストで再利用することになる場合はなおさらです。

于 2014-11-11T02:10:19.250 に答える