在 java 中,调用 completablefuture 的 cancel() 方法可以中断正在执行的任务。该方法接收一个布尔参数 mayinterruptifrunning,若为 true 则尝试中断线程,若为 false 则仅标记取消而不中断线程。调用后任务状态变为 cancelled,后续依赖该任务的步骤将不再执行。

cancel() 方法在不同 mayInterruptIfRunning 值下的行为差异是什么
当 mayInterruptIfRunning 设为 true 时,如果任务正在运行且实现了 FutureTask,它会调用线程的 interrupt() 方法;若设为 false,则不会中断线程,但任务仍会被标记为取消。这决定了任务是被强制停止还是静默放弃。

import java.util.concurrent.*;
public class CancelDemo {
public static void main(String[] args) throws Exception {
ExecutorService executor = Executors.newSingleThreadExecutor();
CompletableFuture<string> future = new CompletableFuture();
// 模拟一个长时间运行的任务
executor.submit(() -> {
try {
System.out.println("Task started...");
Thread.sleep(5000);
future.complete("Done");
} catch (InterruptedException e) {
System.out.println("Task interrupted!");
throw new RuntimeException(e);
}
});
// 立即取消,尝试中断
boolean cancelled = future.cancel(true);
System.out.println("Cancelled: " + cancelled);
executor.shutdown();
}
}</string>
如何判断 cancel() 是否成功以及如何处理取消后的状态
cancel() 返回 boolean 值表示是否成功取消。如果任务已经完成或已被取消,则返回 false。可以通过 isCancelled() 和 isDone() 来检查状态。取消后,任何试图获取结果的操作都会抛出 CancellationException。

import java.util.concurrent.*;
public class CheckCancelStatus {
public static void main(String[] args) throws Exception {
CompletableFuture<string> future = new CompletableFuture();
// 模拟异步设置结果
CompletableFuture.runAsync(() -> {
try {
Thread.sleep(1000);
future.complete("Result");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
// 等待一段时间后取消
Thread.sleep(500);
boolean isCancelled = future.cancel(false); // 不中断
if (isCancelled) {
System.out.println("Successfully cancelled");
} else {
System.out.println("Failed to cancel, task might be done");
}
// 检查状态
System.out.println("Is Done: " + future.isDone());
System.out.println("Is Cancelled: " + future.isCancelled());
}
}</string>
基于程序中某个输入、条件或结果的具体问题:如果任务已经执行完毕,调用 cancel() 会发生什么
如果任务已经执行完毕(即 complete() 已被调用),再次调用 cancel() 将返回 false,并且不会改变任务的状态。任务的结果仍然有效,可以通过 get() 获取。这意味着 cancel()只能用于尚未完成的任务。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











