正常に動作して仕上げ
プログラムの実行が終了すると、スレッドは自動的に終了します。
USEフラグ
一般run()メソッドが実行され、スレッドが正常に終了します、しかし、多くの場合、いくつかのスレッドがサーボスレッドです。彼らは、特定の条件がこれらのスレッドを閉じるために外に満たされた場合にのみ、長期的に必要とします。例えば、可変制御周期を用いて:最も直接的な方法は、ブール・フラグを設定することで、真又は制御にこのフラグをfalseに設定することにより、whileループを終了するかどうかを、サンプルコード:
public class ThreadSafe extends Thread {
public volatile boolean exit = false;
public void run() {
while(!exit){
//do something
}
}
}
出口がtrueの場合、ループ終了は、デフォルト値はfalseで終了している間は、誘導灯出口を定義します。、出口を定義使用する場合のJavaキーワードは、揮発性、このキーの目的は、同期終了する出口の値のみ同時にスレッドによって修正することができることを意味します。
()メソッド割り込み
()メソッドを使用し、割り込み、スレッドが中断知らせるべき、しかし、特定のスレッドがブレークを通知するかを実行し続け、自身が通知するスレッドで処理する必要があります。
あなたは()割り込みを呼び出す2つのケースがあります。
-
スレッドがブロックされている場合、直ちにブロックされたスレッドを終了し、異常例外:InterruptedExceptionをスロー
-
スレッドは、通常のアクティブ状態にある場合、そのスレッドは、フラグがtrueに設定されて中断します。割り込みフラグが設定されているスレッドは、正常に動作し続けます影響を受けません。
そのため、実際に割り込みスレッド、スレッドのニーズが自分の仕事に呼ばれるようにしません()中断。
-
割り込みフラグは、独自のスレッドで停止するように設定されている場合、通常の操作タスクでは、常に、このスレッドで割り込みフラグをチェック
-
()を呼び出すときに割り込み、正確なキャッチ例外後のスレッドの終わりのような例外:InterruptedException例外を扱います。
public class ThreadSafe extends Thread {
public void run() {
while (!isInterrupted()){ //非阻塞过程中通过判断中断标志来退出
try{
Thread.sleep(5*1000); //阻塞过程捕获中断异常来退出
}catch(InterruptedException e){
e.printStackTrace();
break; //捕获到异常之后,执行 break 跳出循环,结束线程
}
}
}
}
stop()メソッド
プログラムが強制スレッドを終了する)(Thread.stopを直接使用することができるが、停止方法は、コンピュータをオフ突然の電源としてではなく、通常のシャットダウン手順として、非常に危険であり、それは予期しない結果を生成することが、主に不安:あなたがいる場合(制御不能)すべてのロックの突然のリリースが保持しているスレッドを起こし(後)Thread.stopを呼び出して、それが保護されたデータの矛盾をレンダリングすることが可能であり、これらのデータの使用の他のスレッドが破損しています、これは、いくつかの非常に奇妙なアプリケーションエラーにつながる可能性があります。したがって、我々は、スレッドを終了するためにstop()メソッドをお勧めしません。