シナリオ:t1スレッドでt2スレッドを終了するにはどうすればよいですか?
間違った考え❌
- stop():Thredの静的メソッドを呼び出して、スレッドを直接強制終了します
- System.exit(int):スレッドを直接強制終了するだけでなく、スレッドを実行しているアプリケーションを直接停止します。
なぜこれが間違った考え方なのですか?たとえば、t1がt2スレッドを呼び出し、この時点でt2スレッドを終了する必要がありますが、t2スレッド本体にはまだ共有リソースがロックされており、現時点ではロックが解除されていません。メソッドはスレッドを終了するために直接呼び出され、次にt1共有リソースを取得することは不可能です。明らかに、これら2つのメソッドには特定の欠点があります。!
2段階終了モード
2段終端モードの導入は、上記の欠点を解決するためのものです。単純に2つのステップとして理解されます。
第一段階:スレッドの実行状態を中断します
第2段:他の共有リソースを処理して解放する
この終了モードは、実際には上記の終了ではありません。つまり、スレッドのstop()メソッドまたはSystem.exit(0)メソッドを呼び出してスレッドを強制終了することはできません。
例を見てください:
シナリオ:メインスレッドでt1(監視)スレッドを終了する必要があります
@Slf4j(topic = "c.Test7")
public class Test7 {
//定义监控线程
private Thread thread;
public static void main(String[] args) throws InterruptedException {
Test7 test7 = new Test7();
//启动线程
test7.start();
Thread.sleep(1000);
//终止线程
test7.stop();
}
//启动监控线程
public void start(){
thread = new Thread("t1"){
@Override
public void run() {
//执行监控
while (true){
boolean interrupted = currentThread().isInterrupted();
//是否被打断
if (interrupted){
log.debug("监控系统被打断");
//处理阶段2的业务代码...
break;
}
try {
Thread.sleep(10000);
log.debug("执行监控记录");
} catch (InterruptedException e) {
e.printStackTrace();
thread.interrupt(); //重新将打断标志置为true
}
}
}
};
thread.start();
}
//停止监控线程
public void stop(){
thread.interrupt();
}
}
分析:
ブロッキング異常がスローされない場合、スレッドは中断され、中断フラグはtrueに設定されます。このとき、正常に終了します。ブロッキング異常がスローされると、中断フラグは次のようになります。 falseに設定すると、処理のために例外InterruptedExceptionによってキャッチされます。interruptedフラグをtrueに設定する必要があることに注意してください。ifを入力した後、実行する必要があるのは次のとおりです。ステージ2スレッドを正常に終了するために!