スレッドを適切に中断する方法は?

この記事は「新人クリエーションセレモニー」活動に参加し、一緒にナゲットクリエーションの道を歩み始めました

スレッドを適切に中断する方法は?

1.スレッドによって提供されるメソッド

  • 割り込み

このメソッドを呼び出すことにより、システムは現在のスレッドに割り込みフラグ(true)を付けます。デフォルトはfalseです。他のスレッドが現在のスレッドでこのメソッドを呼び出す場合、現在のスレッドと現在のスレッドを停止できることを意味します。無視することもできます

  • isInterrupted

現在のスレッドが中断されているかどうかを判断し、現在のスレッドの割り込みフラグビットに従って関連する処理を実行します

  • Thread.interrupted()は、スレッドが中断されるかどうかを決定します。このメソッドは静的メソッドです。isInterruptedとは異なり、割り込みフラグビットは判定後にfalseにリセットされます。
1.1スレッドが提供する方法で操作を中断する(推奨)
 final Thread thread=new Thread("TestCustomisInterrupted"){
            @Override
            public void run() {
                super.run();
                //默认标志位 为false
                while (!isInterrupted()){
                    System.out.println(currentThread().getName()+"::::runing.......");
                }
                System.out.println("执行完成::::"+isInterrupted());  //true
            }
        };

        thread.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();
复制代码

上記は比較的単純な例であり、現在のスレッド実行本体にブロッキングメソッドがある場合はどうなりますか。

 final Thread thread=new Thread("TestCustomisInterrupted"){
            @Override
            public void run() {
                super.run();
                //默认标志位 为false
                while (!isInterrupted()){
                    try {
                        sleep(1000);
                        System.out.println(currentThread().getName()+"::::runing.......");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("执行完成::::"+isInterrupted());  //true
            }
        };

        thread.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();

输入结果

TestCustomisInterrupted::::runing.......
java.lang.InterruptedException: sleep interrupted
	at java.lang.Thread.sleep(Native Method)
	at com.example.socket.MyClass$1.run(MyClass.java:78)
TestCustomisInterrupted::::runing.......
TestCustomisInterrupted::::runing.......
TestCustomisInterrupted::::runing.......
复制代码

割り込み例外がスローされ、割り込みフラグがfalseにリセットされます。スレッドは停止せず、実行を継続します。プログラムで割り込み操作を継続して実行する場合は、で割り込み操作を設定し続けることができます。例外。

Thread.interrupted()静的メソッドを使用して、割り込みが発生した場合、割り込みフラグビットが直接fasleに設定されるかどうかを判断します。

  final Thread thread=new Thread("TestCustomisInterrupted"){
            @Override
            public void run() {
                super.run();
                //默认标志位 为false
                while (!Thread.interrupted()){
                        System.out.println(currentThread().getName()+"::::runing.......");
                }
                System.out.println("执行完成::::"+isInterrupted());  //true
            }
        };

        thread.start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread.interrupt();

TestCustomisInterrupted::::runing.......
TestCustomisInterrupted::::runing.......
执行完成::::false
复制代码

2.スレッドカスタムフィールドを介してスレッドを終了します

 class MyRunable implements Runnable{
            boolean isRun=true;

            public boolean isRun() {
                return isRun;
            }

            public void setRun(boolean run) {
                isRun = run;
            }

            @Override
            public void run() {
                while (isRun){
                    System.out.println("::::runing.......");
                }
                System.out.println("执行完成::::"+isRun);  //true
            }
        }
        MyRunable myRunable=new MyRunable();
       new Thread(myRunable).start();
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        myRunable.setRun(false);


::::runing.......
::::runing.......
::::runing.......
::::runing.......
::::runing.......
执行完成::::false
复制代码

カスタムタグを使用してスレッドを停止することもできますが、スレッドが提供する方法とどのように異なりますか?実行メソッドロジックにブロッキングメソッドがある場合

        class Mythread extends Thread{
            boolean isRun=true;

            public boolean isRun() {
                return isRun;
            }

            public void setRun(boolean run) {
                isRun = run;
            }
            @Override
            public void run() {
                super.run();
                while (isRun()){
                    try {
                        Thread.sleep(4000);
                        System.out.println("::::runing.......");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("执行完成::::"+isRun());  //true
            }
        }

        Mythread mythread=new Mythread();
        mythread.start();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        mythread.setRun(false);

复制代码

sleepメソッドを追加した後、スレッドがスリープしているときに呼び出されたスレッドはmythread.setRun(false);すぐには停止せず、runメソッドの実行後にスリープ時間が経過するまで停止しないことがわかりました。

3.スレッドのstop、suspend、resumeメソッドを使用します

上記の3つのメソッドはスレッドによって提供されますが、現在は期限切れとマークされており、使用することはお勧めしません。上記のメソッドを使用すると、機会と時間がないため、スレッドシステムを停止してもスレッドが占有していたリソースが解放されないためです。スレッドがリソースを解放するため、他の問題が発生するため、お勧めしません。

おすすめ

転載: juejin.im/post/7079289870526447646