8 Interrpt和IsInterrupted

发布时间 2023-06-30 00:04:32作者: 渺阴丶

8 Interrpt()和IsInterrupted()

interrupt()的效果

  如果被打断线程正在 sleep,wait,join 会导致被打断的线程抛出 InterruptedException,并清除 打断标记;如果打断的正在运行的线程,则会设置 打断标记;park 的线程被打断,也会设置 打断标记

IsInterrupted()的效果

  判断是否被打断,不会清除 打断标记

总结

​ 简而言之,interrupt()打断的如果是sleep,wait,join 这几个方法,IsInterrupted()显示的结果是false,即没有打断标记,并且会进入 InterruptedException异常。interrupt()如果打断的是正在运行的线程,那么不会真正的打断正在运行的线程,会把打断标记设置为true,表示该线程被打断了。同时,调用该线程的IsInterrupted()方法会返回true。

两阶段终止模式实例

import java.util.concurrent.TimeUnit;

public class Interrupted2 {

   public static void main(String[] args) throws InterruptedException {
       TwoPhaseTermination tpt = new TwoPhaseTermination();
       tpt.start();

       TimeUnit.SECONDS.sleep(3);
       tpt.stop();

   }
}
//两阶段终止模式
class TwoPhaseTermination {
   private Thread monitor;

   public void start() {
       monitor = new Thread(() -> {
           while (true) {
               Thread current = Thread.currentThread();
               //初始值为false
               boolean flag = current.isInterrupted();
               if (flag) {
                   System.out.println("料理后事");
                   break;
               }

               try {
                   TimeUnit.SECONDS.sleep(1);
                   System.out.println("执行监控记录");
               } catch (InterruptedException e) {
                   e.printStackTrace();
                   //重新设置打断标记
                   //current.interrupt() 如果被打断线程正在 sleep,wait,ioin 会导致被打断的线程抛出 InterruptedException,
                   // 并清除 打断标记;如果打断的正在运行的线程,则会设置 打断标记;park 的线程被打断,也会设置 打断标记
                   current.interrupt();
                   System.out.println(current.isInterrupted());
               }
           }
       });

       monitor.start();
   }

   public void stop(){
       //interrupt(); 只是做了打断标记,并不是真的强制终止线程执行(但是会进入InterruptedException异常)
       //修改中断标志位,并将调用该方法时程序所处的线程退出阻塞状态,此时会通知到被标记的线程并且调用阻塞处会接受到InterruptedException异常。
       // 这里的阻塞比如是调用了sleep,wait,join方法,线程在等待同步锁的过程不属于本阻塞范畴。
       monitor.interrupt();

   }
}

执行结果:

执行监控记录
执行监控记录
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at com.miao.juc.day1.TwoPhaseTermination.lambda$start$0(Interrupted2.java:32)
at java.lang.Thread.run(Thread.java:748)
true
料理后事