interrupt、interrupted 、isInterrupted 区别

       线程中断是一种协作机制,线程可以通过这种机制来通知另一个线程,告诉他在合适的或者可能的情况下停止当前工作,并转而执行其他的工作。

      通过中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。

这好比是家里的父母叮嘱在外的子女要注意身体,但子女是否注意身体,怎么注意身体则完全取决于自己。

‍‍‍‍‍‍‍每一个线程都有一个boolean类型的中断状态。当中断线程时,这个线程的中断状态将被设置为true。‍‍‍‍‍‍‍在Thread中包含了中断线程以及查询线程中断状态的方法      Java中断模型也是这么简单,每个线程对象里都有一个boolean类型的标识(不一定就要是Thread类的字段,实际上也的确不是,这几个方法最终都是通过native方法来完成的),代表着是否有中断请求(该请求可以来自所有线程,包括被中断的线程本身)。例如,当线程t1想中断线程t2,只需要在线程t1中将线程t2对象的中断标识置为true,然后线程2可以选择在合适的时候处理该中断请求,甚至可以不理会该请求,就像这个线程没有被中断一样。

Thread中的中断方法:

public void interrupt():能中断目标线程(interrupt方法仅仅只是将中断状态置为true)

public boolean isInterrupted():返回目标线程的中断状态

public static boolean interrupted():将清除当前线程的中断状态,并返回它之前的值,这也是清除中断状态的唯一方法

一、interrupt

interrupt()仅仅是置线程的中断状态位 ,不会停止线程,需要用户自己去监视线程的状态为并做出相应的处理。这一方法实际上完成的是:在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态

更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。
    如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。
    线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,这时候A会有InterruptedException异常抛出来.但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。
    如果线程A正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态,所以线程A不会抛出InterruptedException,而会一直执行着自己的操作.当线程A终于执行到wait(),sleep(),join()时,才马上会抛出InterruptedException.
    若没有调用sleep(),wait(),join()这些方法,或是没有在线程里自己检查中断状态自己抛出InterruptedException的话,那InterruptedException是不会被抛出来的.

二、interrupted

测试当前线程是否已经中断,在返回线程的状态位后,线程的中断状态由该方法清除(要清掉原来的状态位--恢复成原来情况)。

interrupted是静态方法,返回的是当前线程的中断状态。例如,如果当前线程被中断(没有抛出中断异常,否则中断状态就会被清除),你调用interrupted方法,第一次会返回true。然后,当前线程的中断状态被方法内部清除了。第二次调用时就会返回false。

三、isInterrupted

测试线程是否已经中断。线程的中断状态不受该方法的影响。

时间: 2024-12-14 01:01:07

interrupt、interrupted 、isInterrupted 区别的相关文章

interrupt interrupted isInterrupted 区别

1.interrupt interrupt方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己去监视线程的状态为并做处理.支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为"中断状态",就会抛出中断异常. 2.interrupted 和 isInterrupted 首先看一下该方法的实现: 1 pu

java多线程 interrupt(), interrupted(), isInterrupted()方法区别

interrupt()方法: 作用是中断线程. 本线程中断自身是被允许的,且"中断标记"设置为true 其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限.这有可能抛出SecurityException异常.  若线程在阻塞状态时,调用了它的interrupt()方法,那么它的"中断状态"会被清除并且会收到一个InterruptedException异常. 例如,线程通过wait()进入阻塞状态,此时通过interrupt()

线程停止(stop() interrupt() interrupted() isInterrupted())

stop() 强制停止线程:已经弃用:可能造成数据不一致等问题. interrupt() 在线程中做停止标记,并非真的停止线程. this.interrupted()测试当前线程是否中断,并清除中断状态. this.isInterrupted() 测试线程是否已经中断. 方法声明: public static boolean interrupted()  静态方法 public boolean isInterrupted()       非静态方法 例子: package ThreadTest2

Thread的Interrupt、isInterrupted、interrupted

线程中断:Interrupt.isInterrupted.interrupted 线程并不是抢占式的,线程是协作式的. Interrupt:声明此线程中断,但是线程并不会立即中断: isInterrupted:判断此线程是否已中断,判断完后不修改线程的中断状态: interrupted:判断此线程是否已中断,判断完后清除线程的中断状态 线程的中断状态默认为( isInterrupted=false 或 interrupted=false ),也就是默认不中断线程 Interrupt理解: 中断线

Thread中interrupt()interrupted()和isInterrupted()的区别

在java线程中,线程的状态分为6种.官方文档的解释是:         /**          * Thread state for a thread which has not yet started.          */         NEW,         /**          * Thread state for a runnable thread.  A thread in the runnable          * state is executing in th

interrupt ,interrupted 和 isInterrupted

1.interrupt interrupt方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己去监视线程的状态为并做处理.支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为"中断状态",就会抛出中断异常. 2.interrupted 和 isInterrupted 首先看一下该方法的实现: 1 pu

多线程-interrupt(),isInterrupted(),interrupted()(转)

Content 背景 中断 相关方法 阻塞方法 不可中断的阻塞方法 处理不支持中断的线程中断的常用方法 处理InterruptedException 待决中断 实例1 实例2 参考资料 Top 背景 由于使用stop方法停止线程非常暴力,可能会导致一系列问题.因此,提出一种温和的方式:请求另外一个先不要在执行了,这就是中断方式. 此外有这样的场景:编写 一个程序,需要暂停一段时间,于是调用Thread.sleep(),但是编译器或IDE报错说没有处理检查到的InterruptedExceptio

面试知识点

Java/web基础   Static,final关键字,抽象类,代码块,Object类的方法,==和equels 集合的继承关系及其特性,以及hashMap存取(1.7,1.8),常见IO流对象及使用 反射的知识点 常用设计模式: 多线程方面: 了解并发 创建线程 线程生命周期, 线程中的方法: (sleep.wait,notify,join,yeild,interrupt,interrupted,isInterrupted) synchronized用法(静态方法,非静态方法),特点和缺点等

java线程与并发编程实践(一)

一.给出线程的定义     线程就是一条在程序代码中独立执行的路径 二.给出runnable的定义 一个runnable就是一段封装在对象中的代码序列,它的类实现了runnable接口 三.Thread类和runnable接口完成了什么? 类Thread提供了一个底层操作系统的线程架构的统一接口.Runnable接口为关联了Thread对象的线程提供了执行代码. 四.指出创建一个Runnable对象的两种方式? 创建一个实现Runnable接口的匿名类或者lambda表达式 Runnable r