多线程之线程中断

在多线程之Thread状态中,我们提到,当一个线程由于各种原因,如调用obj的wait方法而转入WAITING状态时,依然能够响应中断。

中断示例

首先需要明确的是,中断不是线程的一种状态。下面开始说明关于中断的三个方法。

在多线程之Thread状态中,我们提到调用notify或notifyAll能够唤醒某个线程B,但是有这样一种可能,由于错误的编码,或者其他什么原因,其他线程都不会调用notify或notifyAll方法,线程B永远不可能被唤醒。又或者基于某种原因,我们明确的表明,不希望线程B处于WAITING状态,并且跳过后续的代码。

这样一个显而易见的需求就要求了,在某个线程A中,例如主线程,Java应该提供一种机制通知另一线程B,使得线程B能够跳出WAITING或者TIMED_WAITING状态,这就是中断。能够达到上述目的的方法是Thread实例方法interrupt。

中断示例二

需要特别注意的是:线程t如非处于WAITING或TIMED_WAITING状态,t.interrupt方法不会起任何作用。但是,当线程t随后进入WAITING或TIMED_WAITING状态,会立即抛出中断异常。

中断示例三

上述输出中,t1会小于t2,这表明:当主线程完成t.interrupt方法调用时,线程t还没有进入sychronized代码块,可以看到在这段时间内,线程t正常的运行。但是当线程t进入sychronized代码块,并且调用o.wait方法后,主线程并没有再次调用t.interrupt方法,然而线程t依然立刻捕获到了异常。

这表明主线程调用线程t的interrupt方法的时机是不受限制的,无需保证在线程t进入WAITING或TIMED_WAITING状态后调用。


第二个方法依然是Thread实例的方法:isInterrupted

该方法返回Thread实例对象是否被设置了中断

isInterruped方法的一个简单示例

但是需要注意的是,如果线程t捕获了中断异常在前,调用isInterrupted方法在后,那么就会返回false。

isInterruped方法返回false

换言之,线程实例的isInterrupted方法返回true,当且仅当主线程调用了线程t的interrupt方法,同时在isInterrupted方法之前,线程t尚未捕获中断异常。

一旦线程t捕获了中断异常,线程t的中断标识就会复位,置为false


最后一个方法是Thread的静态方法:interrupted

这个方法返回调用该静态方法的线程,它有没有被设置中断

静态方法:interrupted

注意,和上面两个实例不同。由于是在线程t中调用的静态方法interrupted,因此它返回的是线程t是否被设置了中断。

时间t1小于t2,这说明,主线程在调用了线程t的实例方法Interrupt方法,为线程t设置了中断之后,程序再执行到Thread.interrputed方法。

第一次调用返回Ture,这是意料之中的事。但是最后再一次调用,返回了False。这说明,静态方法interrupted方法会重置线程t的中断。

你可能感兴趣的:(多线程之线程中断)