zoukankan      html  css  js  c++  java
  • Thread类中interrupt()、interrupted()和isInterrupted()方法详解

    1、interrupt()方法

    其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行

    2、interrupted()方法

    作用是测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中断状态,第二次再调用时中断状态已经被清除,将返回一个false。

    3、isInterrupted()方法

    作用是只测试此线程是否被中断 ,不清除中断状态。

    代码测试:interrupt和LockSupport.park(this)混用的情况

    public class ParkAndCheckInterrupt {
    
        private final boolean parkAndCheckInterrupt() {
            System.out.println("被阻塞之前的状态" + Thread.currentThread().getState());
            LockSupport.park(this);
            System.out.println("被阻塞之后的状态" + Thread.currentThread().getState());
            System.out.println("Thread.interrupted()之前的状态" + Thread.currentThread().getState());
            boolean interrupted = Thread.interrupted();
            System.out.println("Thread.interrupted()之后的状态" + Thread.currentThread().getState());
            return interrupted;
        }
    
    
        public static void main(String[] args) throws InterruptedException {
            ParkAndCheckInterrupt SPCK = new ParkAndCheckInterrupt();
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Before Park!");
                    if (SPCK.parkAndCheckInterrupt()) {
                        System.out.println("中断返回!");
    
                    } else {
                        System.out.println("Unpark返回!");
                    }
                }
            });
            thread.start();
            TimeUnit.SECONDS.sleep(1);
            System.out.println("第一次调用thread.isInterrupted():" + thread.isInterrupted());
            System.out.println("thread.interrupt()之前的状态" + thread.getState());
            thread.interrupt();
            System.out.println("thread.interrupt()之后的状态" + thread.getState());
    
            System.out.println("第二次调用thread.isInterrupted():" + thread.isInterrupted());
            System.out.println("thread是否存活:" + thread.isAlive());
        }
    }

    总结:执行线程的interrupt();方法会设置中断标志位,LockSupport.park()会检查线程是否设置了中断标志位,如果设置了,则返回(这里并不会清除中断标志位)

    interrupt方法的总结:

    1.interrupt 方法打断 sleep,wait,join 的线程。打断阻塞的线程,会抛出InterruptedException异常, 会清空打断状态,即isInterrupted()=false
    2.打断正常运行的线程, 不会清空打断状态,即isInterrupted()=true
    3.打断 park 线程, 不会清空打断状态,打断状态为true时,会让park失效,也不会抛出异常

    参考:https://blog.csdn.net/qq_39682377/article/details/81449451

    参考:https://www.cnblogs.com/septemberFrost/p/12200755.html

  • 相关阅读:
    关于sip和sip的客户端
    android 使用vcard示例
    RTCP:RTP 控制协议(RTP Control Protocol)
    《战地情人》对白摘录
    终于把《ASP.NET 1.1入门经典—— VISUAL C# .NET 2003编程篇》买回来了
    郁闷~居然要用ASP开发生产监控系统
    给计算机系学生的建议[读后感]
    走出你职业生涯的瓶颈读后感
    什么是爱?[转载朋友发给我的信息]
    Boost学习笔记 BOOST_STATIC_ASSERT
  • 原文地址:https://www.cnblogs.com/lhicp/p/15021169.html
Copyright © 2011-2022 走看看