この記事では、Javaスレッドの割り込み割り込みメカニズムについて説明します。
割り込みスレッド
スレッドのスレッドinterrupt()メソッドは、スレッドを中断することです。スレッドの割り込みステータスビット、つまりtrueに設定されます。中断されたスレッドが死ぬか、新しいタスクを待つか、次のステップまで実行し続けるかにかかわらず、プログラム自体に依存します。スレッドは、この割り込みフラグを時々検出して、スレッドを中断するかどうかを判断します(割り込みフラグが真であるかどうか)。 STOPメソッドのような実行スレッドを中断しません。
スレッドが中断されているかどうかを判断します
スレッドが割り込みリクエストを送信したかどうかを判断するには、thread.currentthread()。is interrupted()メソッドを使用してください(スレッド割り込みフラグビットをtrueに設定した直後に割り込みフラグビットをクリアしないため、つまり割り込みフラグをfalseに設定しません)。代わりに、thread.interrupded()メソッド(割り込みフラグビットは、メソッドが呼び出された後、falseにリセットされた後にクリアされます)メソッドを使用しないでください。スレッドがループ内にあるときの割り込み方法は次のとおりです。
while(!thread.currentthread()。is utterrupted()&&もっと作業を行う){より多くの作業を行う}ステータスフラグを割り当てます
割り込み割り込みメカニズムには次の方法があります。
したがって、割り込み中割り込みメカニズムは、現在のスレッドを実際に中断するのではなく、割り込みマークアップの変化です。最初に例でテストしましょう。
public class cutrudtest {//ここで消費される時間は、private static long time = 0を印刷するために使用されます。 private static void resettime(){time = system.currenttimemillis(); } private static void printContent(string content){system.out.println(content + "time:" +(system.currenttimemillis() - time)); } public static void main(string [] args){test1(); } private static void test1(){thread1 thread1 = new shood1(); thread1.start(); // 3秒の遅延後の割り込み中割り込み{thread.sleep(3000); } catch(arturnedexception e){e.printstacktrace(); } thread1.interrupt(); printContent( "実行割り込み"); } private static class thread1 extends thread {@override public void run(){resettime(); int num = 0; while(true){if(is interurded()){printcontent( "current thread is unterrurded");壊す; } num ++; if(num%100 == 0){printContent( "num:" + num); }}}}}}}上記のコードは、thread1スレッドを起動し、thread1スレッドのwhileループでnumに1つを継続的に追加し、100の倍数ごとに印刷することです(印刷が速すぎるのを防ぎます)。次に、3000ミリ秒間寝た後、メインスレッドはthread1スレッドの割り込み方法を呼び出します。次に、出力を見てみましょう。
割り込み割り込み
約3000ミリ秒を取った後、つまりメインスレッドが眠ると、スレッド1スレッドが停止し、スレッド1スレッドが停止することがわかります。つまり、中断の役割とここで中断されることは、setxxとgetxxの役割と同等であり、ブール変数を維持します。
割り込み例外処理
もちろん、割り込みメカニズムは、割り込みステータスビットの変更と検出だけでなく、割り込みの例外を処理することもできます。スレッド.sleep()メソッドが割り込みの例外をキャッチする必要があることを知っているので、睡眠遅延を追加して試してみましょう
while(true){if(is interurded()){printcontent( "current thread is unterrurded");壊す; } num ++; //スリープトライ{shood.sleep(1); } catch(arturnedexception e){e.printstacktrace(); } if(num%100 == 0){printContent( "num:" + num); }}出力の結果を見てみましょう。
割り込み割り込み
ここでは、睡眠後、出力数値が大幅に小さくなります(睡眠がないときに数が10億に達し、CPUは非常に迅速に単純な操作を実行するようです)。ハハ、しかしこれはポイントではありません。ポイントは、出力の例外の後、ISERTERURPTED OUTPUTがFALSEを返し、Thread1スレッドが実行され続け、whileループを終了しないことです。では、なぜこれがあるのですか?睡眠を追加しました。
Thread1スレッドに、スレッドの睡眠、結合方法、オブジェクトの待機、条件の待ち気などなど、中断されたエクセプトの例外をキャッチする必要がある操作がある場合、swret1.interruptメソッドが呼び出されると、swerch1スレッドの中断の例外がスローされます。その後、whileループでは、この例外をキャッチでき、この例外をスローすると、スレッド割り込みフラグはすぐにfalseにリセットされます。したがって、次回のループがfalseであると判断されると判断されたときに途切れると、壊れず、その後、whileループは実行され続けます。
したがって、割り込み()メソッドは、ターゲットスレッドに実行方法にcode codeがあるかどうかに基づいて異なる操作を実行します。
割り込みのアプリケーションシナリオ
通常、割り込みは、スレッド実行のループマーク判断に適しています。たとえば
while(!is intertrupded()){...}ただし、このループに詰まりがある場合、スレッドは次のループを判断することはできません。例えば
while(!is unterrupted()){... while(true){//ここでスレッドが詰まっていますが、中断されたメカニズムは応答できません}}}このようにして、割り込みは無力になり、スレッドは引き続き実行され、中断されて停止しません。
私のgithub-javatestを表示するための例をテストします
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。