スレッドのステータスを設定するという観点から、これら2つの方法については明確ではありません。
Java Docs によると、 Thread.interrupt() はスレッド割り込みステータス フラグを設定し、Thread.interrupted() メソッドを呼び出すとスレッドのステータスが表示され、フラグがクリアされます。
これが実際のシナリオで使用されるようになると..??
スレッドのステータスを設定するという観点から、これら2つの方法については明確ではありません。
Java Docs によると、 Thread.interrupt() はスレッド割り込みステータス フラグを設定し、Thread.interrupted() メソッドを呼び出すとスレッドのステータスが表示され、フラグがクリアされます。
これが実際のシナリオで使用されるようになると..??
他のスレッドが 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() に注意してください。
一般的な使用例:
while(true)
悪い、while(!Thread.interrupted())
良いです)Thread.interrupt() を使用して、スレッドに停止を指示できます。そのスレッドがいくつかのブロッキング操作を実行するか、フラグをチェックすると、スレッドを起動するか停止するために InterruptedException をスローするようにトリガーします。
通常、interrupt() の目的はスレッドを停止することですが、停止するとは限りません。割り込みは、長時間無視することも、完全に無視することもできます。InterruptedException をトリガーする場合、スレッドを停止するのではなく、キャッチしてログに記録 (または無視) できます。
注: ExecutorService 内のスレッドの場合、タスクを中断するとスレッドが中断され、ExecutorService はこれを意図的にキャッチし、スレッドをシャットダウンしません。