在 Java 中,ExecutorService 本身不能直接“取消线程”,而是通过 Future 来取消已提交的任务。下面按常见场景系统说明。
Future.cancel()ExecutorService executor = Executors.newFixedThreadPool(2);
Future<?> future = executor.submit(() -> {
while (true) {
// 模拟长时间任务
Thread.sleep(1000);
}
});
boolean canceled = future.cancel(true);
cancel(boolean mayInterruptIfRunning) 参数说明true:如果任务正在运行,尝试中断线程false:如果任务正在运行,不中断,等它自己结束⚠️
cancel(true)只是设置中断标志,是否真能停止,取决于任务代码
关键:任务必须检查中断状态
executor.submit(() -> {
while (!Thread.currentThread().isInterrupted()) {
// 做点事
}
System.out.println("任务被取消");
});
或:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 恢复中断状态
return;
}
while (true) {
// 不检查中断
}
Future<?> f = executor.submit(runnable);
f.cancel(true);
Future<String> f = executor.submit(callable);
f.cancel(true);
executor.shutdown();
List<Runnable> remaining = executor.shutdownNow();
shutdownNow()内部也是调用任务的interrupt()
| 问题 | 原因 |
|---|---|
cancel(true) 无效 |
任务没检查中断 |
| IO 阻塞无法中断 | 部分 IO(如 Socket)不支持中断 |
| 任务已结束 | cancel() 返回 false |
| 线程池不关 | 程序不退出 |
executor.submit(() -> {
try {
while (!Thread.currentThread().isInterrupted()) {
// 业务逻辑
}
} finally {
// 清理资源
}
});
如果你有 具体场景(如定时任务、HTTP 请求、数据库查询、Spring 中用法),我可以给你更针对性的方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。