面试题答案
一键面试使用标志位安全终止线程
在Java中,可以通过定义一个标志位变量,线程在执行过程中定期检查这个标志位来决定是否终止执行。
- 定义标志位:通常定义一个
volatile
修饰的boolean
类型变量作为标志位,确保线程对该变量的读取和写入具有可见性。 - 线程检查标志位:在线程的
run
方法中,通过循环不断检查标志位,当标志位为true
时,结束线程的执行逻辑。
代码示例
public class ThreadTerminationExample {
private static volatile boolean stopFlag = false;
public static void main(String[] args) {
Thread thread = new Thread(() -> {
while (!stopFlag) {
// 线程执行的任务
System.out.println("Thread is running...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Thread stopped.");
});
thread.start();
// 主线程休眠3秒后设置停止标志
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
stopFlag = true;
}
}
注意事项
- 标志位的可见性:使用
volatile
修饰标志位,确保所有线程能及时看到标志位的变化。如果不使用volatile
,可能会出现线程无法及时感知到标志位变化的情况,导致线程无法正常终止。 - 检查频率:线程应合理设置检查标志位的频率。如果检查频率过高,会增加额外的开销;如果检查频率过低,在设置标志位后线程不能及时响应,可能导致不必要的资源浪费或延迟。
- 异常处理:在线程执行任务过程中,如果发生异常,应妥善处理,确保在异常情况下也能正确终止线程。例如,在捕获异常后可以设置标志位为
true
,以便线程能够正确结束。 - 清理资源:在标志位触发线程终止逻辑后,应确保线程能够正确清理其所占用的资源,如关闭文件句柄、数据库连接等,避免资源泄漏。