zoukankan      html  css  js  c++  java
  • 关于Thread的interrupt

    关于Thread的interrupt

    1. Thread的interrupt方法会引发线程中断。

      主要有以下几个作用:

      • 如Object的wait方法,Thread的sleep等等这些能够抛出InterruptedException异常的方法,在遇到调用对应线程的interrupt方法后就会抛出InterruptedException异常。

        • 抛出InterruptedException时同时会重置中断状态

          如下面代码

                  Thread t=new Thread(()->{
                      try {
                          Thread.sleep(10000);
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                      //由于InterruptedException异常清空了中断状态,这里的Thread.interrupted()返回的是false
                        System.out.println("interrupt statu: "+Thread.interrupted());
                  });
                  t.start();
                  Thread.sleep(3000);
                  t.interrupt();
                  Thread.currentThread().join();
          
        • interrupt调用之后再执行sleep之类,也会抛出InterruptedException异常

                  Thread t=new Thread(()->{
                      Thread.currentThread().interrupt();
                      try {
                          Thread.sleep(1000);
                      } catch (InterruptedException e) {
                          //会抛出异常,走到这里
                          e.printStackTrace();
                      }
                  });
                  t.start();
          
      • LockSupport.park在使当前线程暂停后,调用interrupt方法也会使线程重新唤醒,执行后续代码。

    2、关于Thread的isInterrupted方法

    public static boolean isInterrupted()
    public boolean isInterrupted()
    

    上面两个方法都是检测线程是否被中断,也就是是否调用了interrupt方法。内部都是调用了native方法isInterrupted。

        /**
         * Tests if some Thread has been interrupted.  The interrupted state
         * is reset or not based on the value of ClearInterrupted that is
         * passed.
         */
    //测试线程是否已被中断。 由于ClearInterrupted的值来决定是否重置中断状态。
     private native boolean isInterrupted(boolean ClearInterrupted);
    

    但是有一些区别

    public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }
    

    这个静态方法使判断当前线程是否被中断,isInterrupted里面的入参是true,表示清空中断状态,也就是如果对应线程调用了interrupt进行了中断后,如果连续调用这个方法两次返回值是不一样的,第一次返回true,第二次返回false。因为第一次调用时会重置中断状态。


        public boolean isInterrupted() {
            return isInterrupted(false);
        }
    

    这个方法isInterrupted里面的入参是false,不会重置中断状态。也就是如果对应线程调用了interrupt进行了中断后,如果连续调用两次这个方法返回值都是一样的,都是true。

    如果在调用interrupt进行中断的线程结束后,调用上述两个中断检测,返回值也是false

  • 相关阅读:
    前端
    Spring AOP知识点整理
    【转载】spring aop 面试考点
    【转载】MDC 是什么?
    【转载】在分布式项目中,每个服务器的日志从产生,到集中到一个统一日志平台的流程是什么,中间都有那些过程?
    【转载】门面日志如何自动发现日志组件
    【转载】ArrayList从源码看扩容实现
    【原创】Ajax实现方式
    【转载】servlet与springMVC的差别
    【转载】serlvet
  • 原文地址:https://www.cnblogs.com/wbo112/p/14939351.html
Copyright © 2011-2022 走看看