在java中中断线程的标准做法是调用目标线程对象的 interrupt() 方法,并在线程内部通过检查 isinterrupted() 状态或捕获 interruptedexception 来执行退出逻辑。具体实现时,若线程处于阻塞状态(如调用 sleep),会抛出异常从而中断;若处于运行状态,则需轮询标志位以安全退出。

如何在中断后正确清理资源并退出循环
当线程正在执行一段长耗时任务且未处于阻塞状态时,必须在循环体中显式检查中断状态。如果检测到中断信号,应立即跳出循环并释放相关资源,确保程序不会因忽略中断而继续无效运行。

public class Worker implements Runnable {
private volatile boolean running = true;
@Override
public void run() {
try {
while (running) {
if (Thread.currentThread().isInterrupted()) {
System.out.println("检测到中断,准备退出");
break;
}
// 模拟业务处理
doWork();
}
} catch (Exception e) {
System.out.println("发生异常: " + e.getMessage());
} finally {
System.out.println("资源已清理");
}
}
private void doWork() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException(e);
}
}
}
如何处理阻塞状态下的中断请求
如果线程调用了 wait()、join() 或 sleep() 等阻塞方法,外部调用 interrupt() 会导致该线程抛出 InterruptedException。此时必须捕获该异常,并在处理完后恢复中断状态(除非确定不再需要处理)。
立即学习“Java免费学习笔记(深入)”;

public class BlockingWorker implements Runnable {
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("执行任务...");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
System.out.println("被中断,恢复中断状态");
Thread.currentThread().interrupt();
}
}
}
中断标志位在不同状态下的行为差异是什么
中断标志位是一个布尔值,调用 interrupt() 仅将其设为 true。对于非阻塞线程,它不会自动停止CPU执行,必须由开发者主动查询;而对于阻塞线程,JVM会在进入阻塞前或阻塞期间检查该标志,若为真则清除标志并抛出异常。这种机制确保了中断的即时响应与安全性。


















