这道题也是容易答错的题目之一,原因是因为有一个stop方法容易误导大家
一般也是考核工作三年以内的小伙伴,不属于有难度的题目
但由于出现频率不低,所以,钊哥有必要跟小伙伴们聊一聊
来,老规矩,在往下看答案之前,思考下,效果更佳
1,使用标志位退出线程
这种方式是通过共享一个volatile布尔变量作为退出标志,在线程的run方法中不断检查该标志,当标志为true时,线程将自行停止执行。
来,老铁们,三二一,上代码!
java
// 定义一个volatile的退出标志
private volatile boolean exitFlag = false;
public void run() {
// 在循环中检查退出标志
while (!exitFlag) {
// 执行线程任务
doSomeWork();
// 可以加入适当的休眠或者其他同步机制
// 以防死循环消耗CPU资源
Thread.sleep(100);
}
// 清理工作(如果有)
cleanup();
}
// 当需要终止线程时,设置退出标志为true
public void stopThread() {
exitFlag = true;
}
2,使用interrupt()中断机制
Java提供了一种协作式中断机制,通过调用Thread.interrupt()来请求线程中断,然后在线程内部通过Thread.isInterrupted()检查中断状态,并作出相应的响应。
来,老铁们,三二一,上代码!
java
public class InterruptibleTask implements Runnable {
@Override
public void run() {
try {
// 遍历或阻塞操作时定期检查中断状态
while (true) {
if (Thread.currentThread().isInterrupted()) {
// 检测到中断,清理并退出
System.out.println("线程接收到中断请求,开始退出...");
break;
}
// 执行线程任务
doInterruptibleWork();
// 如果在阻塞方法中,例如sleep,interrupt会抛出InterruptedException
Thread.sleep(100);
}
} catch (InterruptedException e) {
// 处理中断异常,通常重新设置中断状态,因为catch会清除它
Thread.currentThread().interrupt();
System.out.println("线程在阻塞方法中被中断");
} finally {
// 清理工作(如果有)
cleanup();
}
}
public void requestStop() {
// 请求中断线程
Thread.currentThread().interrupt();
}
}
总结
- volatile boolean exitFlag 确保了多线程环境下的可见性和有序性,使得所有线程都能看到最新的标志值。
- Thread.currentThread().isInterrupted() 方法用于检测当前线程是否被中断,若为真则进行相应处理。
- 在finally块中进行必要的清理工作,确保资源得到释放。