1。はじめに
この記事では、Javaマルチスレッドの割り込みメカニズムに関するいくつかの知識ポイントを記録します。主に、STOPメソッドの違い、断絶()、およびIS途中で()メソッドの違いで構成され、ソースコードの実装から簡単な分析を実行します。
Javaで実行されたスレッドを終了する3つの方法があります
swethスレッドは正常に終了します。つまり、run()メソッドが実行されました
threadスレッドクラスのstop()メソッドを使用して、スレッドを強制的に終了します。ただし、STOP()メソッドが期限切れになっており、使用することをお勧めしません
中割り込みメカニズムを使用します
スレッドが正常に終了する場合、何もすることはありません。割り込みメカニズムについては、以下で詳しく説明します。まず、STOP()メソッドのソースコードを見てみましょう。重要なのは、ソースコードに関するコメントです。 STOP()が安全ではない理由、どのスレッドがSTOP()メソッドによって停止されるのかを説明していますか?
/***スレッドに実行を停止するように強制します。* <p>*セキュリティマネージャーがインストールされている場合、その<codeAccess </code>*メソッドは<code> this </code>*で呼び出されます。これにより、A* <codeException </code>が(現在のスレッドで)上げられる可能性があります。* <p>*このスレッドが現在のスレッドとは異なる場合(つまり、現在の*スレッドがそれ自体以外のスレッドを停止しようとしている場合)、*セキュリティマネージャーの<code> checkpermission </code>メソッド(a* <コード> runtimepermission(adthread> code in " <code> securityexception </code>(現在のスレッド) <Code> StreadDeath </code>は、並外れた*クリーンアップ操作を行う必要がない場合を除きます(* <code> threaddeath </code>のスローは<code> </code> try </code>ステートメントのスレッドが正式に死ぬ前に実行されることに注意してください)。 <code> catch </code>句が* <codedeath </codedeath>オブジェクトをキャッチする場合、スレッドが実際に死ぬように*オブジェクトをrethrowすることが重要です。このスレッドを変更できません。 * thread.stopでスレッドを停止すると、ロックされているすべてのモニターのロックが解除されます(チェックされていない* <coded </code>例外の自然な結果として)。これらのモニターによって以前に保護されていたオブジェクトのいずれかが*一貫性のない状態にある場合、損傷したオブジェクトが他のスレッドに表示され、潜在的に任意の動作をもたらす可能性があります。 <code> stop> stop>の多くの使用は、ターゲットスレッドが実行を停止する必要があることを示すように、何らかの変数を単に変更する単純に*変更するコードに置き換える必要があります。ターゲットスレッドは、この変数*を定期的にチェックし、変数が実行を停止することを示している場合、その実行方法から整然とした方法で戻ります。 *ターゲットスレッドが長期間待機している場合(たとえば、条件変数で)、<code> nutter> code </code>メソッドを使用して待機を中断する必要があります。 deprecated?</a>。
上記のように、9〜16行目は、stop()メソッドが「他のスレッド」を停止できることを示しています。 thread.stop()メソッドを実行するスレッドは現在のスレッドと呼ばれ、「他のスレッド」はthread.stop()メソッドを呼び出すオブジェクトスレッドで表されるスレッドです。
のように:
public static void main(string [] args){mythread thread = new mythread ... // .... thread.stop(); // ..}主な方法では、現在のスレッドがメインスレッドです。 4行目に実行され、「その他のスレッド」スレッドを停止したいと考えています。この他のスレッドは、新しいMythreadクラスのスレッドオブジェクトで表されるスレッドです。
21行目から23行目は、まだ開始されていないスレッドを停止できることを示しています。その効果は次のとおりです。スレッドが起動すると、すぐに終了します。
48行目の後のコメントは、STOP()メソッドが非推奨される理由を深く示しています!なぜそれが不安なのか。
たとえば、Threada Threadには、銀行の転送量など、特定の重要なリソースを保護する責任のあるモニターがあります。転送プロセスが進行中の場合、メインスレッドはthreada.stop()メソッドを呼び出します。その結果、モニターがリリースされ、保護するリソース(転送量)は一貫性がない可能性があります。たとえば、アカウントAは100増加しましたが、アカウントBは100増加していません。
第二に、割り込みメカニズム
Javaで割り込みメカニズムを正しく使用する方法については、あまりにも多くの詳細があります。どちらも中断された()とis interrupted()メソッドの両方が、現在のスレッドが中断された状態にあるかどうかを反映しています。
①邪魔()
/***現在のスレッドが中断されているかどうかをテストします。スレッドの* <i>中断ステータス</i>は、この方法によってクリアされます。言い換えれば、この方法が連続して2回呼び出された場合、* 2番目の呼び出しはfalseを返します(最初のコールが中断された*ステータスをクリアした後、2回目のコールがそれを調べる前に、現在のスレッドが再び中断されない限り)。 <code> false </code> retsion。
ソースコードのコメントから、現在のスレッドの割り込み状態をテストし、この方法は割り込み状態をクリアします。
ustingrupted()
/***このスレッドが中断されているかどうかをテストします。スレッドの中断された*ステータス</i>はこの方法で影響を受けません。** <p>スレッドの中断は無視されます*割り込み時にスレッドが無視されます*この方法はfalseに反映されます** @return </code>このスレッドが中断されている場合; is unterrupted(){return is internurded(false);}ソースコードのコメントからわかるように、ISITRURPTERED()メソッドは割り込み状態をクリアしません。
interrated()メソッドとis interrupted()メソッド間の差
ソースコードからわかるように、両方のメソッドが介入されている(boolean clearinderpurded)と呼ばれますが、パラメーターを持つものは真であり、パラメーターのあるものがfalseであることを除きます。
/***いくつかのスレッドが中断されているかどうかをテストします。中断された状態*は、渡されるクリア中断の値に基づいてリセットされているかどうかに基づいています。
したがって、最初の違いは、一方が割り込みフラグビットをクリアし、もう一方が割り込みフラグビットをクリアしないことです。
ソースコードを分析した後、RETURNステートメントの2番目の違いを確認できます。
public static boolean挿入(){return currentthread()。is internurped(true);}/************************/public boolean is unterrupted(){return is unterrupted(false);}中断された()現在のスレッドの中断された状態をテストします。 ISERTERRURDED()は、メソッドを呼び出すオブジェクトで表されるスレッドをテストします。 1つは静的メソッド(現在のスレッドの割り込み状態をテストします)、もう1つはインスタンスメソッドです(インスタンスオブジェクトで表されるスレッドの割り込み状態をテストします)。
以下は、この違いをさらに明確にするための具体的な例です。
次のようにカスタムスレッドクラスがあります。
public class mythreadはスレッドを拡張します{@overridepublic void run(){super.run(); for(int i =; i <; i ++){system.out.println( "i =" +(i +));}}}}}まず中断された()方法の例を見てみましょう。
public class run {public static void main(string [] args){try {mythread thread = new mythread(); thread.start(); shood.sleep(); thread.interput(); // thread.currentthread()。 // ...行5はスレッドスレッドを開始し、6行目はメインスレッドを1秒間スリープするため、スレッドスレッドはCPU実行を取得する機会があります。
メインスレッドが1秒間スリープした後、実行を再開して7行目に再開し、スレッドスレッドを中断するように要求します。
9行目は、スレッドが中断された状態にあるかどうかをテストします。ここでテストされているスレッドはどれですか? ? ?答えはメインスレッドです。なぜなら:
(1)中断された()現在のスレッドの割り込みステータスをテストします
(2)メインスレッドは9行のステートメントを実行するため、メインスレッドは現在のスレッドです
is utterrupded()メソッドの例を見てみましょう。
public class run {public static void main(string [] args){try {mythread thread = new mythread(); shood.start(); shood.sleep(); shood.interput(); system.out.println( "stop?="+thread.isrumpted(); // true true8行目では、スレッドオブジェクトによって呼び出される()メソッド()メソッド。したがって、スレッドオブジェクトで表されるスレッドの割り込み状態がテストされます。 7行目以来、メインスレッドはスレッドスレッドを中断するように要求しているため、8行目の結果は次のとおりです。