1. ホーム

[解決済み】java.lang.Thread.interrupt()は何をするのですか?

2022-04-01 07:36:44

質問

を説明してください。 java.lang.Thread.interrupt() を呼び出すとどうなりますか?

解決方法は?

Thread.interrupt() は、ターゲットスレッドの中断された状態/フラグを設定します。 そして、そのターゲットスレッドで実行されているコードは、中断されたステータスをポーリングし、適切に処理してもかまいません。 のようなブロックするメソッドもあります。 Object.wait() は、中断された状態を直ちに消費し、適切な例外を投げるかもしれません(通常 InterruptedException )

Javaでの割り込みはプリエンプティブではありません。 別の言い方をすれば、割り込みを適切に処理するためには、両方のスレッドが 協力する必要があります。 ターゲットスレッドが割り込みの状態をポーリングしない場合、割り込みは事実上無視されます。

ポーリングは Thread.interrupted() このメソッドは、現在のスレッドの割り込み状態を返し、その割り込みフラグをクリアします。 通常、そのスレッドは InterruptedException を投げるようなことをします。

編集(Thiloのコメントより)。 APIメソッドの中には、割り込み処理を内蔵しているものがあります。 私の頭の中では、これが含まれています。

  • Object.wait() , Thread.sleep() および Thread.join()
  • ほとんどの java.util.concurrent 構造体
  • Java NIO (ただし、java.ioではない) で、これは InterruptedException を使用し、代わりに ClosedByInterruptException .

EDIT (より トーマス・ポーニン への回答 全く同じ質問 をご覧ください。)

スレッドの中断は、スレッドを優しくなでる方法です。スレッドに終了のチャンスを与えるために使用されます。 すっきり とは対照的に Thread.stop() というのは、アサルトライフルでスレッドを撃っているようなものです。