关于线程的中断,我们在基础篇三中已经有所接触,估计大家都会有这么一个感觉,理解这部分内容非常吃力,更不用说自己写程序来验证了。我也是,我花了挺长时间来学习这部分的内容,虽然总是能够感受到线程的中断状态的大概意思,但是就是很难用语言表述出来,所以这部分内容如果分享的不能满足大家的需要,请谅解。
线程的中断状态是独立于线程的五个基本状态之外的一个特殊状态,用来标记线程是否被中断,也就是说是否调用interrupt方法,isInterrupted方法可以记录下这个中断状态。interrupt方法可以改变线程的中断状态,即对一个线程调用interrupt方法后,如果我们检测该线程的isInterrupted,可以发现中断状态由false变为true。我找到了一个比较不错的例子可以帮助我们理解这一部分的内容,我稍作了一点修改,这样,我们不仅能够看到interrupt方法对线程的影响,也可以调用interrupt方法从一个sleep很长时间的线程中退出来。
public class ThreadDemo {
public static void main(String[] args) throws Exception {
ThreadA ta = new ThreadA();
ta.setName("ThreadA");
ta.start();
Thread.sleep(2000); //主线程睡眠2秒以后调用interrupt方法
System.out.println(ta.getName()+"正在被中断。。。");
ta.interrupt();
System.out.println(ta.isInterrupted()+"----------------");
//调用了interrupt方法,ta线程的isInterrupted变为true
}
}
class ThreadA extends Thread {
int count = 0;
public void run() {
System.out.println(getName() + "将要运行。。。");
while (!this.isInterrupted()) {
System.out.println(getName() + "运行中" + count++);
try {
Thread.sleep(4000000);
//线程进入一个非常长时间的睡眠
} catch (InterruptedException e) {
//当本线程睡眠被interrupt中断后将进入本catch语句块
//我发现当线程进入catch语句块后,中断状态被取消了,即isInterrupted变为了false
//所以如果我们在catch中不作处理,该线程将会继续循环下去,再一次进入长睡眠
System.out.println(getName()+"从阻塞状态中退出。。。");
//再一次调用interrupt方法,此时this.isInterrupted()又变为true
//这样继续执行程序时将会退出循环
//如果想退出该线程,还有一个简单的方法,注释掉catch剩下的语句 ,直接用return;
this.interrupt();
System.out.println("本线程是否已经中断(isInterrupted):"+this.isInterrupted());
System.out.println("本线程是否已经中断(isInterrupted):"+this.isInterrupted());
//isInterrupted方法返回线程是否被中断,且不会改变此时的中断状态
//所以两次输出都是true
//而interrupted方法,虽然也可以返回中断状态,但是调用时会取消当前的中断状态
//所以第一次调用时为true,第二次调用结果就为false了
System.out.println("本线程是否已经中断(interrupted):"+Thread.interrupted());
System.out.println("本线程是否已经中断(interrupted):"+Thread.interrupted());
}
}
System.out.println(getName()+"已经停止");
}
}
线程的中断状态是独立于线程的五个基本状态之外的一个特殊状态,用来标记线程是否被中断,也就是说是否调用interrupt方法,isInterrupted方法可以记录下这个中断状态。interrupt方法可以改变线程的中断状态,即对一个线程调用interrupt方法后,如果我们检测该线程的isInterrupted,可以发现中断状态由false变为true。我找到了一个比较不错的例子可以帮助我们理解这一部分的内容,我稍作了一点修改,这样,我们不仅能够看到interrupt方法对线程的影响,也可以调用interrupt方法从一个sleep很长时间的线程中退出来。
public class ThreadDemo {
public static void main(String[] args) throws Exception {
ThreadA ta = new ThreadA();
ta.setName("ThreadA");
ta.start();
Thread.sleep(2000); //主线程睡眠2秒以后调用interrupt方法
System.out.println(ta.getName()+"正在被中断。。。");
ta.interrupt();
System.out.println(ta.isInterrupted()+"----------------");
//调用了interrupt方法,ta线程的isInterrupted变为true
}
}
class ThreadA extends Thread {
int count = 0;
public void run() {
System.out.println(getName() + "将要运行。。。");
while (!this.isInterrupted()) {
System.out.println(getName() + "运行中" + count++);
try {
Thread.sleep(4000000);
//线程进入一个非常长时间的睡眠
} catch (InterruptedException e) {
//当本线程睡眠被interrupt中断后将进入本catch语句块
//我发现当线程进入catch语句块后,中断状态被取消了,即isInterrupted变为了false
//所以如果我们在catch中不作处理,该线程将会继续循环下去,再一次进入长睡眠
System.out.println(getName()+"从阻塞状态中退出。。。");
//再一次调用interrupt方法,此时this.isInterrupted()又变为true
//这样继续执行程序时将会退出循环
//如果想退出该线程,还有一个简单的方法,注释掉catch剩下的语句 ,直接用return;
this.interrupt();
System.out.println("本线程是否已经中断(isInterrupted):"+this.isInterrupted());
System.out.println("本线程是否已经中断(isInterrupted):"+this.isInterrupted());
//isInterrupted方法返回线程是否被中断,且不会改变此时的中断状态
//所以两次输出都是true
//而interrupted方法,虽然也可以返回中断状态,但是调用时会取消当前的中断状态
//所以第一次调用时为true,第二次调用结果就为false了
System.out.println("本线程是否已经中断(interrupted):"+Thread.interrupted());
System.out.println("本线程是否已经中断(interrupted):"+Thread.interrupted());
}
}
System.out.println(getName()+"已经停止");
}
}