在 Java 中,中断线程并不是强制杀死线程,而是通过“协作机制”通知线程:你该停了。是否真的停止,由线程自己决定。
下面系统地说明 如何中断 Java 线程。
interrupt() + isInterrupted()thread.interrupt();
这只是设置中断标志位,并不会立刻停止线程。
线程需要自己检查中断状态:
while (!Thread.currentThread().isInterrupted()) {
// 执行任务
}
或使用 interrupted()(会清除中断状态):
while (!Thread.interrupted()) {
// 执行任务
}
run() 方法中循环任务@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
System.out.println("工作中...");
}
System.out.println("线程结束");
}
调用:
thread.interrupt();
如果线程在 阻塞状态,调用 interrupt() 会:
InterruptedExceptiontry {
Thread.sleep(1000);
} catch (InterruptedException e) {
// 恢复中断状态(推荐)
Thread.currentThread().interrupt();
break;
}
⚠️ 最佳实践:捕获异常后重新设置中断状态。
ExecutorServiceExecutorService executor = Executors.newSingleThreadExecutor();
Future<?> future = executor.submit(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 任务
}
});
future.cancel(true); // 中断线程
❌ 以下代码无法被 interrupt 停止:
while (true) {
// 没有检查中断
}
❌ synchronized 阻塞 不会响应中断
✅ 可用 ReentrantLock.lockInterruptibly() 替代
Thread.stop()thread.stop(); // 已废弃,危险
可能导致:
public class MyTask implements Runnable {
@Override
public void run() {
try {
while (!Thread.currentThread().isInterrupted()) {
// 业务逻辑
Thread.sleep(500);
}
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断
}
}
}
Java 线程中断 = 通知机制,不是强制 kill
线程必须“配合”才能安全退出。
如果你有具体场景(如定时任务、IO 阻塞、线程池),我可以给你更针对性的示例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。