1.原理を紹介します:
むしろ必須よりも、通知する割り込み使用。
Javaでは、スレッドを停止するための最良の方法は、割り込み割り込みを使用しているが、これは単にスレッドは、「あなたが実行を停止する必要がある」終了することが通知され、スレッド自体かどうか、いつに決定する(決定する力を終了しますされますパーティやコンベンションの良いコーディング仕様に準拠するためにパーティーを停止する停止要求に応じて、)を停止します。
簡単なタスクとスレッドを開始します。時間のほとんどは、我々は彼らが接合東まで実行してみましょうか、彼らは自分自身で停止させます。しかし、時には我々は、ユーザが操作またはサービスがすぐにシャットダウン、または不足したり、間違ったことをキャンセルし、おそらくので、結び目東タスクやスレッドを進めたいです。タスクとスレッドが安全に、迅速かつ確実に停止させることができるために、簡単な作業ではありません。Javaは安全にスレッドを終了する任意のメカニズムを提供しません。しかし、それは(中断これは、調整メカニズムは、別のスレッドの現在の作業を終了するスレッドを可能にしている)、割り込みを提供します。
この協調的アプローチが必要であり、我々はほとんどのタスク、スレッドを望んでいないか、それはすぐに矛盾した状態でデータ構造を共有して停止するので、すぐにサービスを停止します。代わりに、あなたは準備し、サービスでの共同作業を使用することができます:あなたが停止する必要があるときは、最初に、現在行われている作業した後、最後にクリアされます。コードのタスクは、コード自体がクリーンアップ作業を実行する方法をより明確に取り消し要求を発行したよりも、これは、より高い柔軟性を提供します。
ライフ(エンド・オブ・ライフサイクル)の終了は、問題のタスクだけでなく、サービスの設計とプロセスが複雑になると、これは非常に重要であるが、多くの場合、プログラム設計の要素を見落としなどのプログラムの実施を行います。ソフトウェアの不本意に同梱のソフトウェアの良い行動との間の1つの大きな違いは、そのソフトウェアは非常に行儀完全に治療の失敗、シャットダウンおよびキャンセル処理することができます。
2、どのようにスレッドの権利を停止するには
- 普通の状況は、通常、どのような状況で停止するスレッド。
- すべてのコードを実行した後
- そこキャッチされない例外。
3、停止割り込み、いくつかのケースを使用しました。
- 最も一般的な状況
/ ** * @data 2019年11月9日- 20:07 *説明:スリープ状態または待機メソッドメソッドが実行されません、スレッドの停止 * / パブリック クラス RightWayStopThreadWithoutSleep 実装Runnableを{ @Override 公共 のボイドの実行(){ int型 NUM = 0 ; 一方(NUM <= Integer.MAX_VALUEの/ 2 &&!にThread.currentThread()isInterruptedを()){ IF(NUM%で10000 == 0 ) のSystem.out.println(NUM + "は10000の倍数です" )。 NUM ++ ; } System.out.printlnは( "ジョブが完了しました" ); } パブリック 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ スレッドのスレッド = 新しいスレッド(新しいRightWayStopThreadWithoutSleepを())。 thread.start(); Thread.sleep( 1000年); thread.interrupt(); } }
- スレッドは、スレッドをブロック停止を検出すると
/ ** * @data 2019年11月9日- 20:07 *説明:メソッド睡眠中断スレッドと * / パブリック クラスRightWayStopThreadWithSleep { 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ たRunnableのRunnableを(= ) - > { int型 NUM = 0 ; 試み{ 一方(NUM <= 300 &&!にThread.currentThread()isInterruptedを()){ IF(100%NUM == 0 ) のSystem.out.println(NUM +「100倍数" ); NUM ++; } のThread.sleep( 1000 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } }。 スレッドスレッド = 新しいスレッド(実行可能)。 thread.start(); Thread.sleep( 500 )。 thread.interrupt(); } }
結果:
0〜100の倍数であり、 100は100の倍数であり、 200は100の倍数であり、 300は100の倍数である java.lang.InterruptedException:SLEEPが中断 ATがjava.base / java.lang.Thread.sleep(ネイティブメソッド) threadcoreknowledge.stopthreads AT $ $メイン.RightWayStopThreadWithSleep.lambda 0(RightWayStopThreadWithSleep.java:18 ) java.base AT /java.lang.Thread.run(Thread.java:844)
いくつかの方法の睡眠、待機スレッドが割り込み通知された場合、スレッドは、ブロックされているので、これらのメソッドは、通知方法に対処するには、InterruptedExceptionある例外をスローすることです。
- スレッドは、各反復の後にブロックされている場合
/ ** * @data 2019年11月10日- 9:13 *説明:各実行中に、各ループ方式がスリープまたは待機のような呼び出した場合は、各反復かどうかをチェックする必要はありません。それは中断されました。 * / パブリック クラスRightWayStopTHreadWithSleepEveryLoop { 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ RunnableをRunnableを > - =(){ int型 NUM = 0 ; 試み{ 一方(NUM <= 10000 ){ IF(100%NUM == 0を) のSystem.out.println(NUM + "100の倍数である" )。 (のThread.sleep 10 )。 NUM ++ ; } } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } }。 スレッドスレッド = 新しいスレッド(実行可能)。 thread.start(); Thread.sleep( 5000 ); thread.interrupt(); } }
サイクル、CPU走行速度では、ほとんどの時間は、それをブロックする方法なので、各反復は中断されたことを確認する必要はありませんに滞在 - (。にThread.currentThread()isInterruptedを())
4、のtry / catch、中断の故障につながるの内側に置くかの間、
/ **
* @data 2019年11月10日- 9時24午前
*説明:のtry / catchと内部しばらくした場合、故障の割り込みにつながります
* /
publicクラスCantInterrupt {
公共の静的な無効メイン(文字列[] args)が例外:InterruptedExceptionをスロー{
実行可能な実行可能=() - > {
int型NUM = 0;
一方、{(NUM <10000 &&にThread.currentThread()isInterruptedを()!)
IF(100%NUM == 0){
するSystem.out.println(NUM +「100倍数「);
}
NUM ++;
試み{
のThread.sleep(10);
}キャッチ(InterruptedExceptionあるE){
e.printStackTrace();
}
}
}。
スレッドスレッド=新しいスレッド(実行可能)。
thread.start();
Thread.sleep(5000);
thread.interrupt();
}
}
結果:
0〜100の倍数であり、 100は、100の倍数である 200は、100の倍数である 300〜100の倍数である 400は、100の倍数である java.lang.InterruptedException:SLEEPが中断 java.base AT / (ネイティブメソッド)java.lang.Thread.sleep ATメインthreadcoreknowledge.stopthreads.CantInterrupt.lambda $ $ 0(CantInterrupt.java:17 ) java.base AT /java.lang.Thread.run(Thread.java:844 ) 500は、100の倍数であり、 600は100の倍数である 700 100複数
チェックが中断追加されていますが、睡眠、待ち時間などの機能ブロックは、スレッドは、スレッドがブロックフラグになりますときので、まだコンテンツの実行の内部で、クリアされている間に例外は、プログラムの後にスローされた場合でもでも予告端子にどのリード信号スレッドに、スレッドを検出できません
情報処理端末の開発5、実際の好ましい方法は、:
/ ** * @data 2019年11月10日- 9:41 *説明:ベストプラクティス:キャッチInterruptedExcetionだけの好み:メソッドシグネチャでスロー *それから、実行()しようとすることを余儀なくされます/キャッチ * / パブリック クラスは RightWayStopTHreadInProd 実装したRunnable { @Override 公共 無効RUN(){ ながら、(真の){ 試み{ System.out.printlnは( "ゴー" ); throwInMethod(); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace() ; } } } 専用 ボイド throwInMethod()はスローInterruptedExceptionある{ のThread.sleep( 2000 )。 } パブリック 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ スレッドのスレッド = 新しいスレッド(新しいRightWayStopTHreadInProdを())。 thread.start(); Thread.sleep( 1000年); thread.interrupt(); } }
理由:
この方法の好みは例外をスローします。
数字はそう例えば、そのrunメソッドが例外をキャッチすることができ、トップに例外を渡すことができ、キャプチャTY例外ステートメントブロックを使用せずに、あなたの道InterruptedExceptionあるスローします。
runメソッドでチェック例外(のみ使用トライキャッチ)を投げることができないため、トップレベルの方法が見つからないか、飲み込まれ、そしてコードの堅牢性を向上させる場合と例外、回避の遵守を処理する必要があります。