Javaマルチスレッドの2段階終了モード

シナリオ: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スレッドを正常に終了するために!

おすすめ

転載: blog.csdn.net/JAYU_37/article/details/110285615