今天聊些线程中断相关的内容,因为笔者在看书之前是不知道了解这些东西的,所以这里做下笔记。可能还有其他和笔者一样的朋友,可以参考一下。
和线程中断的有3个方法,分别是:interrupt()、interrupted()、isInterrupted()。区别在于:interrupt用于设置目标线程对象的一个中断标志;interrupted()是一个静态方法,用来返回当前目标线程的标志值,而isInterrupted()则是动态的,它必须在一个线程对象上执行。
有一点很重要的是线程在wait()、sleep()、join()中被interrupt()会抛出异常,但是又不会置将中断标记置为true,而在非阻塞状态中中断标记会被置为true,但却又不会报异常。很有意思吧,这意味着如果线程正处于非阻塞状态处理事务,则对线程调用interrupt后,线程会继续当前事务,只是线程的中断标记被设置了而已。这很重要!!
谈谈笔者对以上现象的理解,可以这么想,如果线程处于阻塞状态(sleep,wait,join),则调用interrupt目的是让线程立刻退出阻塞状态,于是通过抛出一个异常来实现立刻中断。其实我们可以忽略这个异常,然后使线程马上往下继续运行。至于在非阻塞状态被中断,应该是出于操作完整性的考虑,即首先要保证本次操作的完整性,然后对当前任务置中断标记,使得线程在开启下次任务前根据中断标记来彻底结束线程。总结一句话,线程中断是以循环为单位,即要保持每次循环运行的完整性,中断的意思不是kill本次循环内的操作,而是阻止下次循环的开始。
测试代码:
package com.wly.javathread.chap4;
/**
* 测试interrupt
* 一、在wait()、sleep()、join()中被interrupt()会抛出异常,但是又不会置interrupt标记。在其他非阻塞
* 状态中被interrupt则会置中断标记,但却不会报异常。
二、意味着,如果线程正处于非阻塞状态处理事务,则对线程调用interrupt后,线程会继续当前事务,只是线程的中断标
记被设置了而已。这很重要!!
* @author wly
*
*/
public class TestInterrupt {
/**
* @param args
*/
public static void main(String[] args) {
//测试线程,不断的创建MyThread,然后中断
new Thread() {
@Override
public void run() {
super.run();
int i = 0;
while(i < 2) {
MyThread myThread = new MyThread();
myThread.start();
//生成随机的中断时间间隔,进行测试
try {
sleep((int)(Math.random() * 4000));
} catch (InterruptedException e) {
e.printStackTrace();
}
myThread.interrupt();
if(myThread.isInterrupted()) {
i++;
}
}
}
}.start();
}
static class MyThread extends Thread {
@Override
public void run() {
super.run();
while(!isInterrupted()) {
//阻塞耗时阶段
System.out.println("线程" + Thread.currentThread().getId() + "进入阻塞--");
try {
sleep(2000);
} catch (InterruptedException e) {
System.out.println("--线程被中断了,当前中断标记值:" + interrupted());
}
System.out.println("线程" + Thread.currentThread().getId() + "退出阻塞--");
//非阻塞耗时阶段
System.out.println("线程" + Thread.currentThread().getId() + "进入非阻塞--");
for(int i=0;i<100000;i++) {
for(int j=0;j<50000;j++) {
j++;
}
}
System.out.println("线程" + Thread.currentThread().getId() + "退出非阻塞--");
System.out.println("线程" + Thread.currentThread().getId()
+ "中断标记值:" + isInterrupted());
}
}
}
}
运行结果:
线程9进入阻塞--
--线程被中断了,当前中断标记值:false
线程9退出阻塞--
线程9进入非阻塞--
线程11进入阻塞--
线程9退出非阻塞--
线程9中断标记值:false
线程9进入阻塞--
线程11退出阻塞--
线程11进入非阻塞--
线程9退出阻塞--
线程9进入非阻塞--
线程11退出非阻塞--
线程11中断标记值:true
线程9退出非阻塞--
线程9中断标记值:false
线程9进入阻塞--
线程9退出阻塞--
线程9进入非阻塞--
线程9退出非阻塞--
线程9中断标记值:false
线程9进入阻塞--
线程9退出阻塞--
线程9进入非阻塞--
线程9退出非阻塞--
从上面运行结果可以看出,在阻塞状态中断不会改变中断标记,而在非阻塞状态会改变中断标记。
O啦~~~
转载请保留出处:http://blog.youkuaiyun.com/u011638883/article/details/18326893
谢谢!!