//对 interrupt(); 的理解
//1. IS_INTERRUPTED = true;IS_INTERRUPTED是中断标志位
//2. 如果线程处于调用以下三个方法
// wait()/join()/sleep()造成阻塞,就直接
// 抛出InterruptedException异常
//3. 抛出异常以后,修改为IS_INTERRUPTED = fasle;
t.interrupt(); //实例调用
代码比较:
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()){
System.out.println(Thread.currentThread().getName());
//抛出异常
Thread.sleep(1000);//有异常
//处于休眠状态也可以中断(抛出异常中断)
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
Thread.sleep(3000);
t.interrupt();
}
若没有 Thread.sleep(3000); ,因为 main 线程 比 t 线程 被系统调度的早,所以则直接执行到 t.interrupt(); 时,会修改中断标志位为true,之后系统调度到 t 线程时,经过while循环的判断条件时,判断条件不满足,并不会进入循环,不会打印,就结束了t 进程。
有 Thread.sleep(3000); 时,,休眠三秒,在这三秒里 t 线程已经被系统调度到,t 线程运行时,此时 t线程 的 中断标志位 是 fasle 会进入while循环里,先打印,然后会遇到休眠的语句Thread.sleep(1000);休眠后再继续判断是否满足while循环条件,继续打印 、 休眠、打印、休眠,直到Thread.sleep(3000);语句休眠结束,执行到 t.interrupt(); 行会让 中断标志位 置true,在t 线程中运行到Thread.sleep(1000);时,会抛出 InterruptedException 异常 ,t 线程结束。
//代码2
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()){//while循环放在外面
//异常再循环内部处理。
try {
System.out.println(Thread.currentThread().getName());
//抛出异常
Thread.sleep(1000);//有异常
//处于休眠状态也可以中断(抛出异常中断)
} catch (InterruptedException e) {
//抛出异常后,修改为IS_INTERRUPTED = fasle
e.printStackTrace();
}
}
}
});
t.start();
t.interrupt();
}
以上代码,因为main线程执行到 t.interrupt();把中断标志位置为true,后面执行到 t 线程 时 没有进入到循环 结果是 进程结束。
代码3
public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(new Runnable() {//匿名内部类传入Runnable
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()){
System.out.println(Thread.currentThread().getName());
//抛出异常
Thread.sleep(1000);//有异常
//处于休眠状态也可以中断(抛出异常中断)
}
} catch (InterruptedException e) {
//抛出异常后,修改为IS_INTERRUPTED = fasle
e.printStackTrace();
}
}
});
t.start();
Thread.sleep(3000);
t.interrupt();
}
加上Thread.sleep(3000);时 t 线程开始运行一段时间,打印了几次,但是等Thread.sleep(3000);休眠结束,执行到 t.interrupt();时,把中断标志位修改成true ,遇到 t 线程中的 Thread.sleep(1000);休眠时,会抛出异常,抛出异常后,受到t.interrupt();的影响(中断标志位又被置为fasle),但由于抛出异常的操作是在while循环中的,while循环的判断条件仍然满足,进入循环,执行打印、休眠,然后就一直执行打印、休眠的操作。