在 Java 中,线程中断(Interrupt)并不是强制杀死线程,而是“礼貌地通知”线程该停止了。线程收到中断信号后,由自身决定如何处理。
下面从 原理 → 常用方法 → 正确写法 → 常见坑 讲清楚。
| 方法 | 作用 |
|---|---|
thread.interrupt() |
给线程发送中断信号 |
Thread.interrupted() |
返回并清除当前线程的中断状态 |
thread.isInterrupted() |
返回中断状态(不清除) |
InterruptedExceptionrun() 中检查中断(推荐)public class MyTask implements Runnable {
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
// 干活
System.out.println("working...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 收到中断,恢复中断状态并退出
Thread.currentThread().interrupt();
break;
}
}
System.out.println("线程结束");
}
}
调用:
Thread t = new Thread(new MyTask());
t.start();
Thread.sleep(3000);
t.interrupt();
以下方法会 抛出 InterruptedException:
Thread.sleep()Object.wait()Thread.join()BlockingQueue.take()示例:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 被中断
Thread.currentThread().interrupt(); // 建议恢复中断
return;
}
⚠️ 不要吞掉异常
stop()(已废弃)thread.stop(); // 危险,可能导致数据不一致
❌ 绝对不要用
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 什么都不做
}
后果:中断信号丢失,线程无法停止
volatile boolean 替代中断(不通用)volatile boolean running = true;
✅ 可以用,但 无法中断阻塞状态(如 sleep/wait)
ExecutorService executor = Executors.newFixedThreadPool(2);
Future<?> future = executor.submit(task);
future.cancel(true); // 中断线程
Java 中中断线程 = 发送信号 + 线程自己配合退出
✅ 正确做法:
interrupt() 发信号isInterrupted() 或 InterruptedException 检查run()如果你有 具体场景(如线程池、定时任务、阻塞队列),我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。