【マルチスレッド】Threadメソッド:interrupt()、isInterrupted()、interrupted()説明

3732 ワード

前言:


3つのメソッドは、いずれもThreadで定義されたメソッドであり、interrupted()はThreadの静的メソッドです.interrupt()は、呼び出しスレッドにブレークポイントを追加しますが、このスレッドは終了しません.isInterrupted():このスレッドの割り込み状態を返しますが、このスレッドの割り込み状態は削除されません.interrupted():現在のスレッドの割り込み状態が返され、現在のスレッドの割り込み状態が削除されます.
isInterrupted()とinterrupted()の違い
メソッド名
スレッド割込みステータスを返します
スレッドの割り込みステータスが削除されるかどうか
作用範囲【ポイント】
isInterrupted()
はい
いいえ
呼び出しスレッド
interrupted()
はい
はい
現在のスレッド

コードの例

  • isInterrupted():
  • public class ThreadTest extends Thread{
    
        public static void main(String[] args) throws InterruptedException {
            ThreadTest threadTest = new ThreadTest();
            threadTest.start();
    
            // 1. threadMethod  
            threadTest.interrupt();
    
            // 2. threadTest  
            System.out.println(" threadTest :" + threadTest.isInterrupted());
            System.out.println(" threadTest :" + threadTest.isInterrupted());
        }
    
        @Override
        public void run() {
            for (int i =0 ; i<10; i++){
                if(i == 5){
                    // 3.  
                    System.out.println(" :" + Thread.currentThread().isInterrupted());
                    System.out.println(" :" + Thread.currentThread().isInterrupted());
    
                    // 5.   
                    if (Thread.interrupted()){
                        return;
                    }
                }
                System.out.println("i == " + i);
            }
        }
    }
    

    印刷結果-実行順序が異なる場合があります.
     threadTest :true
     threadTest :true
    i == 0
    i == 1
    i == 2
    i == 3
    i == 4
     :true
     :true
    

    解析:コード1はthreadTestにスレッド割込み状態を加え,割込みされたスレッドオブジェクト呼び出しisInterrupted()によりスレッドの割込み状態を取得し,コード2 3の複数回の取得結果はいずれもTrueであり,最後にコード5により実行中のスレッドを終了し,メインスレッドによる他のスレッドの制御を実現する.
  • interrupted()はThread内蔵静的メソッドであり、Threadを呼び出す.interrupted() :
  • public class ThreadTest extends Thread{
    
        public static void main(String[] args) throws InterruptedException {
            ThreadTest threadTest = new ThreadTest();
            threadTest.start();
    
            // 1. threadMethod  
            threadTest.interrupt();
    
            // 2. threadTest  
            System.out.println(" main :" + Thread.interrupted());
            System.out.println(" main :" + Thread.interrupted());
        }
    
        @Override
        public void run() {
            for (int i =0 ; i<10; i++){
                if(i == 5){
                    // 3.  
                    System.out.println(" :" + Thread.interrupted());
                    System.out.println(" :" + Thread.interrupted());
    
                    // 4.   
                    if (Thread.interrupted()){
                        return;
                    }
                }
                System.out.println("i == " + i);
            }
        }
    }
    

    印刷結果:
     main :false
     main :false
    i == 0
    i == 1
    i == 2
    i == 3
    i == 4
     :true
     :false
    i == 5
    i == 6
    i == 7
    i == 8
    i == 9
    

    解析:コード1はthreadTestスレッドにスレッド割込み状態を付加し、コード2は現在のスレッド【main】の割込み状態を取得するのでfalseコード3はinterruptedがスレッド割込み状態を除去するので、1回目はTrueに戻って2回目はFalseに戻る.コード5 interruptedはスレッド割込み状態を除去しているのでRuturnできません

    ソース:


    なぜ両者の間に違いがあるのか、ソースコードを見てみるとわかりますが、多くの解釈があります.
    // isInterrupted()  
    public boolean isInterrupted() {
            return isInterrupted(false);
     }
    
    // interrupted  , 
    public static boolean interrupted() {
            return currentThread().isInterrupted(true);
    }
    
    //  。
    public static native Thread currentThread();
    
    
     /**
      *     
       * ClearInterrupted  
       */
    private native boolean isInterrupted(boolean ClearInterrupted);
    
    

    注意:スレッドメソッドwiat、join、sleepの3つのメソッドの1つが機能する場合、そのinterrupte()メソッドを呼び出すと、CPUの実行を占有していないスレッドが自分に割り込み状態を置くことはできないため、InterruptedException異常が生成されます.