スレッドを理解します
コンセプト
スレッドは、プログラム内の実行スレッドです。 Java仮想マシンにより、アプリケーションは複数の実行スレッドを同時に実行できます。
スレッド機能
スレッドの状態を表す状態があります。同時に、JVMのスレッドには1つの状態しかありません。
・新しい
まだ開始されていないスレッド(プログラムの開始以来開始されていないスレッド)
runnable
JVMで実行されている実行可能なスレッドですが、CPUなどの他のリソースを待っている可能性があります。
blockedブロック
スレッドをブロックし、ロックが実行され続けるのを待っています
・待っている
無限の待機(特定の操作を実行するためにその状態に入ることに依存するスレッドで再び実行)
timed_waiting
待機時間(指定された待機時間内に特定の操作のためにその状態に入ることに依存するスレッドで再び実行)
emoned終了
出口スレッド
優先順位を持ち、スレッドの実行順序を決定します。
1〜10の整数は、デフォルト値が5です。値が高いほど、実行の可能性が高く、優先度はスレッドの実行順序を決定しません。
子スレッドの優先順位は、デフォルトで親スレッドの優先順位と同じです。
JVMは、次のときにすべてのスレッドの実行を停止することに注意してください。
実行時間のExit()メソッド(ランタイム)が呼び出され、メソッドの呼び出しはセキュリティマネージャーによって許可されます。
すべての「非デイモンスレッド」は、実行を停止しました(通常の停止か停止かどうかに関係なく)。
デーモン(デーモン)としてマークすることができます
デーモンスレッドの子スレッドは、まだデーモンスレッドです。
デーモンスレッドは「バックエンドスレッド」でもあり、一般にバックグラウンドタスクを実行するために使用されますが、ユーザースレッドは一般にユーザーレベルのタスクを実行します。
スレッドを終了する方法
1.出口フラグを使用して、スレッドを通常の出口にします。つまり、実行方法が完了した後にスレッドが終了します。
実行方法が実行されると、スレッドは終了します。しかし、実行方法が終了しない場合があります。たとえば、スレッドを使用して、サーバープログラムのクライアント要求、またはループ処理が必要なその他のタスクをリッスンします。この場合、これらのタスクは通常、whileループなどのループに配置されます。ループを永久に実行したい場合は、(true){...}を使用してそれを処理することができます。ただし、特定の条件下でwhileループを出るようにしたい場合は、最も直接的な方法は、ブール型フラグを設定し、このフラグをtrueまたはfalsに設定することでループが終了するかどうかを制御することです。 Exitフラグを使用してスレッドを終了する例は次のとおりです。
flagexitthread.java
パッケージcom.rainmonth;/*** 2017/3/23にRandyzhangによって作成されました。
Democlient.java
パッケージcom.rainmonth;/*** 2017/3/23にRandyzhangによって作成された*/public class democlient {public static void main(string [] args){system.out.println( "エレガントターミナルスレッドインスタンス"); exitbyflag(); // exitbyinterrupt(); = new flagexitthread(flagexitthread.class.getsimplename()); flagexitthread.start(); try {shood.sleep(1000); flagexitthread.isexit = true; flagexitthread.join(); system.out.out.println( "exit");} catch e) {e.printstacktrace();}} private static void exitbyinterrupt(){flagexitthread flagexitthread = new flagexitthread(flagexitthread.class.getSimplename()); system.out.println( "flagexitthread ..."); flagexitthread.start( {shood.sleep(1500); system.out.println( "flagexitthread挿入..."); flagexitthread.interrupt(); shood.sleep(1500); system.out.println( "stop application ...");} catch(arternedexception e){e.printstrace();}}}}出力結果:
スレッドが終了した後、私が実行している束を印刷します。
2。停止方法を使用してスレッドを強制的に終了します(この方法は推奨されません。ストップは一時停止と履歴書と同じであり、予測不可能な結果も得られる可能性があるため)。
呼び出しstop()メソッドを表示します。ソースコードのstop()の説明は次のとおりです。
/**この方法は本質的に安全ではありません。 * thread.stopでスレッドを停止すると、ロックされているすべてのモニターのロックが解除されます(チェックされていない* <coded </code>例外の自然な結果として)。これらのモニターによって以前に保護されていたオブジェクトのいずれかが*一貫性のない状態にある場合、損傷したオブジェクトが他のスレッドに表示され、潜在的に任意の動作をもたらす可能性があります。 <code> stop> stop>の多くの使用は、ターゲットスレッドが実行を停止する必要があることを示すように、何らかの変数を単に変更する単純に*変更するコードに置き換える必要があります。ターゲットスレッドは、この変数*を定期的にチェックし、変数が実行を停止することを示している場合、その実行方法から整然とした方法で戻ります。 *ターゲットスレッドが長期間待機している場合(たとえば、条件変数*)、<code> interrupt </code>メソッドを使用して*待機を中断する必要があります。*/
一般的な意味は、この方法の不安が固有であるということです。 STOP()を呼び出してスレッドを終了すると、ロックされているすべてのモニターがリリースされます(これにより、スレッドデース例外がスタックに沿って上向きに伝播して、スローするようにチェックされます)。これらのリリースされたモニターによって以前に保護されていたオブジェクトに矛盾があり、これらのオブジェクトが他のスレッドに表示される場合、これは予期せぬ結果につながります。操作を停止する必要があるものは、ターゲットスレッドが実行を停止することを示すために特定のコードを変更するだけであるコードに置き換える必要があります(方法1はこの方法です)。ターゲットスレッドが特定の条件(特定の条件変数など)を長時間待機する場合、割り込み方法を使用して待機を中断する必要があります(これは方法3の方法です)。
3.割り込み方法を使用してスレッドを中断します。
割り込みは文字通り終了を意味しますが、割り込みを呼び出してスレッドを終了しようとしないでください。メソッドを呼び出す場合でも、スレッドは実行され続けることがあります。上記のexitbyflag()にコメントし、exitbyintersupt()メソッドを有効にして、割り込み()メソッドが時間内に呼び出されていることを確認できます。割り込み方法を使用しても安全ではないことがわかります。
要約します
上記の分析によると、最も推奨される方法は最初の方法です。共有変数を使用してフラグを設定し、信号を送信して、終了する必要があるスレッドに通知できます。もちろん、この共有変数の操作が同期していることを確認する必要があります。
上記は、Java終了スレッドインスタンスとSTOP()メソッドソースコードの読み取りに関するこの記事のすべての内容です。私はそれが誰にでも役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!