スレッドを適切に停止します

1.スレッドを停止する方法

スレッドを停止する方法は3つあります。

1.終了フラグを使用して、スレッドを終了させます

2.メソッドが推奨されない場合は、stop()メソッドを使用してスレッドを強制的に終了します[期限切れのメソッド]

3.interrupt()メソッドを使用してスレッドを中断します

2.割り込み方式

割り込み方式を使用すると、スレッドをすぐに停止するのではなく、停止マークを付けることができます。

3.具体的にスレッドを停止するにはどうすればよいですか?

以下の方法は、「Javaマルチスレッドプログラミングコアテクノロジー」という本で説明されています。

1.異常な方法(推奨)

public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            for (int i = 0; i < 500000; i++) {
                if (MyThread.interrupted()){
                    System.out.println("已经是停止状态了,我要退出了!");
                    throw new InterruptedException();
                }
                System.out.println("i = " + (i+1));
            }

            System.out.println("如果我被输出了,则代表线程没有停止");
        } catch (InterruptedException e) {
            System.out.println("在MyThread类中的run方法中被捕获");
            e.printStackTrace();
        }
    }
}
/**
 * 根据中断状态退出for循环
 */
public class Main {

    public static void main(String[] args) {
        try {
            MyThread myThread  = new MyThread();
            myThread.start();
            Thread.sleep(100);
            myThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("end!");
    }
}

結果は次のとおりです。

2.スリープ状態でスレッドを停止します

睡眠の中断は2つの状況に分けられます:

  1. 最初にスレッドをスリープさせてから、割り込みを呼び出して割り込み状態をマークします。割り込みは、ブロックされたスレッドを中断します。スレッドを停止する効果を実現するために、割り込み例外がスローされます。
  2. スレッドは最初に割り込みを呼び出して割り込み状態をマークし、次にスレッドはスリープします。スレッドを停止する効果を実現するために、割り込み例外がスローされます。

1.最初に寝る

public class MyThread extends Thread {

    @Override
    public void run() {
        try {
            System.out.println("run-----------start");
            Thread.sleep(5000);
            System.out.println("run-----------end");
        } catch (InterruptedException e) {
            System.out.println("在沉睡中被停止!进入catch,线程的是否处于停止状态:" + this.isInterrupted());
            e.printStackTrace();
        }

    }
}

 

public class Main {

    public static void main(String[] args) {
        try {
            MyThread myThread = new MyThread();
            myThread.start();
            Thread.sleep(2000);
            System.out.println("状态:"+MyThread.interrupted());
            myThread.interrupt();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 

結果は次のとおりです。

2.最初に割り込みをマークします

public class MyThread1 extends Thread {

    @Override
    public void run() {
        try {

            for (int i = 0; i < 100000; i++) {
                System.out.println("i = " + (i+1));
            }
            System.out.println("run begin");
            //interrupt是做一个中断标记,当时不会去中断正在运行的线程,当该线程处于阻塞状态时就会进行中断
            //因此,先进行interrupt后,再遇到sleep阻塞时,才会进行中断
            Thread.sleep(200000);
            System.out.println("run end");

        } catch (InterruptedException e) {
            System.out.println("先停止,再遇到了sleep! 进入catch!");
            e.printStackTrace();
        }
    }
}
public class Main1 {

    public static void main(String[] args) {

        MyThread1 myThread1 = new MyThread1();
        myThread1.start();
        myThread1.interrupt();
        System.out.println("end!");
    }
}

結果は次のとおりです。

3.暴力的な停止を停止する(非推奨)

4.returnステートメントはスレッドを停止します

  • 割り込み状態としてマークされた割り込みを呼び出した後、runメソッドで現在のスレッド状態を判断し、割り込み状態の場合は戻ります。これにより、スレッドを停止する効果が得られます。

備考:スレッド停止のイベントを伝播できるように、例外をcatchブロックにスローすることもできるため、「例外のスロー」メソッドを使用してスレッドを停止することをお勧めします。

おすすめ

転載: blog.csdn.net/f_a_ker/article/details/114109996