Java终止线程的方法

Java终止线程的方法

1. 抛异常

该方法让线程抛出Error的子异常ThreadDeath异常来暴力终止线程,ThreadDeath继承于Error。

如果想要调用stop方法又想要料理线程后事,可以在run方法代码块中捕获ThreadDeath或Error或Throwable异常,在catch方法中处理后事。

注意在catch中考虑重新抛出异常来终止线程,不这样做视情况可能会变成线程救援(如在循环中捕获并处理)。

线程救援示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
class TimeThread extends Thread {
@Override
public void run() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
while (true) {
try {
simpleDateFormat.format(new Date());
} catch (ThreadDeath e) {
System.out.println("线程救援...");
}
}
}
}

另外一提,JDK不建议使用该方法,原因是抛出异常将会解除该线程所持有的monitor监视器,造成线程安全隐患(monitor是Java的Synchronized关键字实现的重要对象)。

2. Thread实例对象的interrupt()方法

该方法类似于设置线程状态,设置线程为中断状态。如果线程处于调用wait、sleep、join时,会将中断状态清除并抛出InterruptedException异常(从名字上可知继承于Exception),捕获异常进行相关处理最后return来停止线程。

如果线程处于循环时,这个方法似乎起不了作用,其实可以在循环的第一行进行判断,判断当前线程并调用isInterrupted()方法获取线程是否被设置为中断状态。

循环处理示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
class TimeThread extends Thread {
@Override
public void run() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
while (true) {
if (Thread.currentThread().isInterrupted()){
// 停止线程
break;
}
simpleDateFormat.format(new Date());
}
}
}

3. 设置中断标志

设置相关属性,在代码中进行判断是否需要停止。

代码示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class TimeThread extends Thread {
public static volatile boolean flag = false;
@Override
public void run() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:ss");
while (true) {
if (flag){
// 停止线程
break;
}
simpleDateFormat.format(new Date());
}
}
}

Java终止线程的方法
https://blog.gugu.dev/2024-02-21/Java终止线程的方法/
作者
MinMin
发布于
2024年2月21日
许可协议