【java】Javaスレッドのinterrupt()関数の正しい開き方


JAvaソースコードのinterrupt関数の定義:
public void interrupt() {
        if (this != Thread.currentThread())
            checkAccess();

        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);
                return;
            }
        }
        interrupt0();
    }

Java割り込みの正確な位置決めと使用
Javaでの割り込みinterruptは、論理値のみで表されるフラグ状態にすぎません.trueとfalseは、デフォルトではfalseが非割り込み状態を意味します.javaソースコードは、この割り込み状態を利用して、プログラマがスレッドの実行を自分で制御できるようにしたいと考えています.すなわち、中断状態はスレッドの実行に影響を与えません.スレッドは何をすべきですか.Javaの割り込みはcpuを制御できないと理解でき、名詞の意味しかない.スレッドの割り込み方法を呼び出し、プログラムがブロック呼び出しに入るか、またはブロック呼び出しに入った場合、この割り込み信号はInterruptedExceptionによってキャプチャされてリセットされるべきですが、これもソースコードで設計されており、本当にプログラムの実行を停止することとは少しも関係ありません.しかし、私たちは必要なときにこのInterruptedExceptionに対応する操作を処理するだけです.run()メソッドセグメントでブロック操作が発生しない場合、割り込みは異常を放出しません.interrupted()メソッドで割り込みチェックと割り込みフラグのリセットを行う必要があります.また,IO操作やsynchronized上のブロックが中断できないことを知ることも必要である.コードとコメントで説明します
package com.myThread;

public class TextForInterrupt extends Thread {
    public static void main(String[] args){
        TextForInterrupt textForInterrupt = new TextForInterrupt();
        textForInterrupt.start(); //    ,  Runable
        //textForInterrupt.interrupt();
    }
//           run()   
    public void run(){
        for (int i = 0; i <= 9; ++i) {
            try {
                sleep(2000); //   2 ,           ,            2   
                interrupt();  //       true,          sleep()   ,       

            } catch (InterruptedException e) {
                //        ,              false,  try   ,           
                //        true,             
                //           
                System.out.println("      ");
            }
            System.out.println(Thread.currentThread().isInterrupted()); //         
            System.out.println(i);	//       
                /*
                *              true ,   sleep()           ,         。
                *                     false,           。
                *            。
                * */
            }
        }
    }	
}


プログラムの実行結果は、次のとおりです.
D:\Java\jdk-10.0.1\bin\java.exe "-javaagent:D:\IntelliJ IDEA Community Edition 2018.1.3\lib\idea_rt.jar=64316:D:\IntelliJ IDEA Community Edition 2018.1.3\bin" -Dfile.encoding=UTF-8 -classpath E:\javaproject\chapter08\out\production\chapter08 com.myThread.TextForInterrupt
true  //  2                ,      true       interrupt();
0
        //                    ,      true    ,  sleep(2000),
			//   InterruptedException  ,   catch  ,      catch   ,  
			//sleep(2000)     ,          false,           
false	
1
true  //            ,                 
2
      
false
3
true
4
      
false
5
true
6
      
false
7
true
8
      
false
9

Process finished with exit code 0


次の3つの関数の使用方法に注意してください:Interrupt():この関数の実行の唯一の結果は、割り込みフラグをtrueに設定することです.interrupted():この関数は、まず現在の割り込みフラグ状態、すなわちtrueまたはfalseを返し、その後、割り込み状態をfalse、isInterrupted():この関数は現在の割り込み状態、すなわちtrueまたはfalseを返します.