zoukankan      html  css  js  c++  java
  • java线程interrupt、interrupted 、isInterrupted区别

    前言

    在分析interrupt之前,应该先了解java里线程有5种状态,其中有一个阻塞状态,interrupt和阻塞有关

    interrupt() 方法

    作用于要中断的那个线程。

    interrupt() 方法只是改变中断状态而已,它不会中断一个正在运行的线程

    这一方法实际完成的是,调用该方法的线程发出一个中断信号,这样当该线程执行到阻塞位置时(wait(),sleep(),join())就会抛出InterruptedException以退出阻塞,从而达到退出线程的目的

    如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。

    注意:

    当线程A执行到wait(),sleep(),join()时,抛出InterruptedException后,中断状态已经被系统复位了,此时调用线程A的Thread.interrupted()返回的是false。

    interrupted() 方法

    首先看一下API中该方法的实现: 

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

    interrupted是作用于当前正在运行的线程,并且会清除线程的状态位

    isInterrupted() 方法

    再来看一下API中 isInterrupted的实现: 

    1 public boolean isInterrupted () { 
    2      return isInterrupted( false); 
    3 } 

    isInterrupted 是作用于调用该方法的线程对象所对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以在A线程中去调用B线程对象的isInterrupted方法。)不会清除线程的状态位

    因此这两个方法有两个主要区别
    1. interrupted 是作用于当前线程,isInterrupted 是作用于调用该方法的线程对象所对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以在A线程中去调用B线程对象的isInterrupted方法。)
    2. 这两个方法最终都会调用同一个方法-----isInterrupted( Boolean 参数),只不过参数固定为一个是true,一个是false;               注意: isInterrupted( Boolean 参数)是isInterrupted( )的重载方法
    由于第二个区别主要体现在调用的方法的参数上,让我们来看一看这个参数是什么含义
    先来看一看被调用的方法 isInterrupted(boolean arg)(Thread类中重载的方法)的定义:
    private native boolean isInterrupted( boolean ClearInterrupted);
    原来这是一个本地方法,看不到源码(不明白native关键字的,可以参阅这篇:java中native关键字的用法)。不过没关系,通过参数名ClearInterrupted我们就能知道,这个参数代表是否要清除状态位

    如果这个参数为true,说明返回线程的状态位后,要清掉原来的状态位(恢复成原来情况)。这个参数为false,就是直接返回线程的状态位。

    这两个方法很好区分,只有当前线程才能清除自己的中断位(对应interrupted()方法)

  • 相关阅读:
    python提供的网络接口API和Linux Socket API间的关系探究 liushu
    业务领域建模Domain Modeling liushu
    分析一套源代码的代码规范和风格并讨论如何改进优化代码 liushu
    案例分析:设计模式与代码的结构特性 liushu
    如何提高程序员的键盘使用效率 liushu
    网络相关的命令工具研究报告 liushu
    用例建模Use Case Modeling liushu
    WdatePicker日历控件使用方法
    添加Web服务引用,服务引用,WCF服务开发
    JS大总结
  • 原文地址:https://www.cnblogs.com/shamo89/p/8854539.html
Copyright © 2011-2022 走看看