Java基础sleep与interrupt

 阅读大约需要1分钟

Java基础sleep与interrupt

  1. interrupt用于向线程发终止通知信号,会影响该线程内部的中断标志位

  2. 当前线程本身不会因为interrupt而改变状态,状态的具体变化需要等待接收到中断表示的程序的最终处理结果来判定。

  3. 调用interrupt不会中断当前线程的运行,它只改变中断标志位。

  4. 若因调用sleep方法使线程处于阻塞态,这时调用interrupt方法会抛出InterruptedException,线程提前结束。

  5. 在抛出异常前会清理中断标志位,抛出异常后调用isInterrupted()是会返false。

  6. 可以通过中断标志位来安全终止线程

安全终止线程
  1. 先调用interrupt方法改变中断标志位

  2. 在run方法中用isInterrupted()来判断

代码如下:

public class SleepInterrupt {
    public static void main(String[] args) {
        Runner2 r = new Runner2();
        r.start();
        try
        {
            Thread.sleep(4000);
        }catch (InterruptedException e) {
        }
        r.interrupt();
    }


    static class Runner2 extends Thread{
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()) {
                System.out.println("---this is run---");

                try {
                    Thread.sleep(1000);
                }catch (InterruptedException e) {
                    System.out.println("---catch interrupt---");
                    this.interrupt();
                }
            }
            System.out.println("---end---");
        }
    }

}

抛出异常后调用isInterrupted()返会false,所以要终止线程,调用this.interrupt(); 中断标志位变为true,线程不满足运行条件结束运行。