遅くに私はJavaでマルチスレッドに取り組んでいます。スレッドが BLOCKED 状態にある場合、なぜ中断できないのかを理解したいですか? また、スレッドが WAIT 状態にある場合にのみスレッドを中断できるのはなぜですか? 基本的に、中断できるスレッド状態と中断できないスレッド状態の 2 つのスレッド状態が必要なのはなぜですか?
この質問は非常に基本的なものかもしれませんが、私は単に物事を覚えるのではなく、物事を理解しようとしています。
遅くに私はJavaでマルチスレッドに取り組んでいます。スレッドが BLOCKED 状態にある場合、なぜ中断できないのかを理解したいですか? また、スレッドが WAIT 状態にある場合にのみスレッドを中断できるのはなぜですか? 基本的に、中断できるスレッド状態と中断できないスレッド状態の 2 つのスレッド状態が必要なのはなぜですか?
この質問は非常に基本的なものかもしれませんが、私は単に物事を覚えるのではなく、物事を理解しようとしています。
スレッドに現在の操作を停止させ、InterruptedException
? Java のスレッド割り込みは単なるフラグです。BLOCKED スレッドで問題なく呼び出すことができinterrupt()
、次回コードがチェックするときにそのフラグが表示されます。
このような機能を実装する際の主な問題は、キーワード ( synchronized
) がどのように例外をスローすることになっているのかということです。 InterruptedException
はチェック済みの例外です。言語ですべての同期メソッド (およびブロック) をthrows InterruptedException
!
割り込みは通信ツールであり、通常、チェックする必要があるシステム状態についてスレッドに知らせるためのものです。この名前は、調べる必要がある特定の状態 (一部の入力ピンに設定された新しい値など) についてマイクロプロセッサに知らせるために、ハードウェア内で設定されたフラグからの従来のキャリー オーバー/アップワードです。「割り込み」という名前を読みすぎて、別のスレッド内でプログラムの流れを中断するためのツールであると考えないでください。そうではない。したがって、例外をスローするメソッドでさえ、それをチェック済みとして宣言し、他のスレッドはそれを無視して、必要に応じて待機を再開できます。別のスレッドの状態を任意に中断できるとBLOCKED
、プログラム フローが中断されますが、これは目的ではありません。
ブロックされたスレッドは中断できます。スレッドの状態に応じて、スレッドで割り込みが呼び出される方法を次に示します。javadocsから:
このスレッドの checkAccess メソッドが呼び出されると、SecurityException がスローされる可能性があります。
このスレッドが Object クラスの wait()、wait(long)、または wait(long, int) メソッド、または join()、join(long)、join(long, int) の呼び出しでブロックされている場合、sleep(long)、または sleep(long, int)、このクラスのメソッドの場合、その割り込みステータスはクリアされ、InterruptedException を受け取ります。
このスレッドが割り込み可能なチャネルでの I/O 操作でブロックされた場合、チャネルは閉じられ、スレッドの割り込みステータスが設定され、スレッドは ClosedByInterruptException を受け取ります。
このスレッドがセレクターでブロックされている場合、スレッドの割り込みステータスが設定され、セレクターのウェイクアップ メソッドが呼び出されたかのように、スレッドは選択操作からすぐに戻ります。おそらくゼロ以外の値になります。
前の条件のいずれも保持されない場合、このスレッドの割り込みステータスが設定されます。
生きていないスレッドを中断しても、何の効果もありません。
例外: SecurityException - 現在のスレッドがこのスレッドを変更できない場合