今天研究多线程中的 中断线程 的概念 在java多线程中 stop()方法已经被废弃,留下了其余三个方法原型:
public void interrupt();
public boolean isInterrupted();
public static boolean interrupted();
字面是中断的意思 但是这并不是直接中断某线程 而是设定一个中断状态 我们取到这个状态 该怎么处理是我们自己决定
public void interrupt();
中断这个线程,这个线程的中断状态设为true。当这个线程被阻塞在wait,join,sleep等方法的时候,调用 interrupt会让wait,join,sleep方法抛出InterruptedException,并且这个线程的interrupt状态被清空(设为false)。public static boolean interrupted();
调用interrupt(静态方法)会返回当前线程的interrupt状态(true 或false),并把当前线程的interrupt状态清空(设为false)。所以你如果第二次调用interrupted方法,只会返回false。
注意:这个是个静态方法,并且里面调用的是currentThread(),所以返回的状态是当前运行的线程,不是对象调用者的线程状态。public boolean isInterrupted();
判断此对象调用者的线程是true还是false,不影响中断状态再补充一个原理:wait,join,sleep方法执行后,会不断的轮询监听 interrupted
标志位,发现其设置为true后,会停止阻塞并抛出 InterruptedException异常。
然后我们看一个例子:
/**
*
* 根据上面三个方法的原理对下面的结果对号入座
*
* @author panqian
* @date 2016年12月21日 下午7:05:28
*/
package Thread;
public class InterruptRunnable_2 implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("我在外面。。。。");
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
System.out.println("线程因为在sleep时被中断抛出异常,捕捉到InterruptedException");
//interrupt碰到线程阻塞 sleep()抛异常 清空中断状态 中断状态设为false
if (Thread.currentThread().isInterrupted()) {
System.out.println("我走了。。。。");
}
//interrupt未碰到线程阻塞 中断状态设为true
Thread.currentThread().interrupt();
if (Thread.currentThread().isInterrupted()) {
System.out.println("我还是走了。。。。");
}
//interrupt清空中断状态 中断状态设为false
Thread.interrupted();
if (Thread.currentThread().isInterrupted()) {
System.out.println("我真的走了。。。。");
}
}
}
}
}
package Thread.test;
import Thread.InterruptRunnable_2;
/**
* 试验中断线程
*
* @author panqian
* @date 2016年12月21日 下午7:05:28
*/
public class InterruptThread_2 {
public static void main(String[] args) {
InterruptRunnable_2 interruptRunnable_2 = new InterruptRunnable_2();
final Thread thread = new Thread(interruptRunnable_2);
thread.start();
thread.interrupt();
}
}
执行结果
我在外面。。。。
捕捉到InterruptedException
我还是走了。。。。 (只执行了这个输出指令 原因看代码注释)
我在外面。。。。
我在外面。。。。
我在外面。。。。
无限循环
最后感谢 网上的一些资料 在此只是做个总结