文章目录
- 1.前言
- 2. 方法1: 自定义标志位
- 3. 方法2:使用标准库自带的标志位
- 4.总结
1.前言
线程中断是指在一个线程执行的过程中,强制终止该线程的执行。虽说是中断,但本质上是让run方法快点执行完,而不是run方法执行到一半,强制结束.
本文主要介绍线程中断的两种方法
2. 方法1: 自定义标志位
看下面这段代码:
public class Demo6 {
private static boolean flag = false;
public static void main(String[] args) {
Thread t = new Thread(()->{
while(!flag){
System.out.println("线程执行中!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
System.out.println("线程执行完了!");
});
t.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("设置标志位,让线程执行结束");
flag = true;
}
}
运行结果:
看下面这张图:
在这段代码中,定义了一个flag
的标志位,在线程t
中以标志位作为run
方法的执行条件,每隔1s输出一次"线程执行中",再先让main
线程(主线程)休眠3s,3s后main
线程开始执行,输出"设置标志位,让线程执行结束",并修改flag
变量的值为false
,线程t
不满足执行条件,因此线程t
执行完毕.
3. 方法2:使用标准库自带的标志位
Java提供了一种中断线程的机制,即调用线程的interrupt()
方法。
当一个线程被中断时,它会收到一个中断信号,但并不意味着线程会立即停止执行。线程可以通过检查自己的中断状态来决定是否停止执行。线程可以通过调用isInterrupted()
方法来检查自己是否被中断。如果线程已经被中断,那么该方法返回true,否则返回false。
示例:
public class Demo7 {
public static void main(String[] args) {
Thread t = new Thread(()->{
while(!Thread.currentThread().isInterrupted()){
System.out.println("线程执行中!");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("线程执行完了!");
});
t.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
System.out.println("设置标志位,让线程执行结束");
t.interrupt();
}
}
但是这么写,会有问题
能看到,这里抛出了一个异常.而且虽然设置标志位,但是线程并没有结束.
注意interrupt
方法有两种行为:
- 如果线程是正常状态,会设置标志位为true
- 如果线程是阻塞状态(sleep),不会设置标志位,而是会触发一个
InterruptedException
这样的异常,这个异常会将sleep
提前唤醒.由于我这里的catch
中只是打印了日志,并没有结束循环,因此线程仍在执行中
如果想要结束循环,可以在catch
中加上break
4.总结
线程中断机制是一种优雅的线程停止方式,可以避免线程无限期地等待某个条件而导致程序出现死锁或无响应的情况。但是,线程中断并不是强制终止线程的方法,它需要线程自己来判断是否停止执行。因此,在编写线程时,需要注意在适当的时候检查线程的中断状态并做出相应的处理。
感谢你的观看!希望这篇文章能帮到你!
专栏: 《从零开始的Java学习之旅》在不断更新中,欢迎订阅!
“愿与君共勉,携手共进!”