0

スレッドのステータスを設定するという観点から、これら2つの方法については明確ではありません。

Java Docs によると、 Thread.interrupt() はスレッド割り込みステータス フラグを設定し、Thread.interrupted() メソッドを呼び出すとスレッドのステータスが表示され、フラグがクリアされます。

これが実際のシナリオで使用されるようになると..??

4

2 に答える 2

7

他のスレッドが Thread.interrupt() を呼び出すと、メソッドは Thread の割り込みステータス フラグ (最初は false) を true に設定します。Thread が Thread.sleep()、Thread.join()、Object.wait() などのブロッキング メソッドにある場合、ブロックが解除され、InterruptedException がスローされます。

Thread.interrupted() は、割り込みステータス フラグの現在の値 (true または false) を確認するために使用できる静的メソッドです。また、割り込みステータスをクリアし、フラグを false に設定します。つまり、2 回続けて呼び出すと、最初に true が返されたとしても、2 回目に false が返される可能性があります (スレッドが再度中断されない限り、最初の呼び出しの後に割り込みステータス フラグが true に設定されます)。

リセットせずに割り込みステータスをチェックできる 3 番目のメソッド Thread.isInterrupted() に注意してください。

一般的な使用例:

  1. ブロッキング操作から例外的にブレークする
  2. 論理的な保存/停止ポイントで長い一連の命令を続行する必要があるかどうかを判断する
  3. 長時間実行されるタスクを開始する前に、一連の指示を続行する必要があるかどうかを判断します
  4. そうでなければ永久に続く反復プロセスの実行を停止します(while(true)悪い、while(!Thread.interrupted())良いです)
于 2012-10-17T07:31:29.853 に答える
1

Thread.interrupt() を使用して、スレッドに停止を指示できます。そのスレッドがいくつかのブロッキング操作を実行するか、フラグをチェックすると、スレッドを起動するか停止するために InterruptedException をスローするようにトリガーします。

通常、interrupt() の目的はスレッドを停止することですが、停止するとは限りません。割り込みは、長時間無視することも、完全に無視することもできます。InterruptedException をトリガーする場合、スレッドを停止するのではなく、キャッチしてログに記録 (または無視) できます。

注: ExecutorService 内のスレッドの場合、タスクを中断するとスレッドが中断され、ExecutorService はこれを意図的にキャッチし、スレッドをシャットダウンしません。

于 2012-10-17T07:32:04.107 に答える