天博体育APP官方版
热点资讯
你的位置:天博体育APP官方版 > 新闻动态 > Java 并行任务协作式取消机制设计与实现

新闻动态

Java 并行任务协作式取消机制设计与实现

发布日期:2026-02-06 11:37    点击次数:51

这篇文章主要根据我最近做的线程池任务支持协作式取消功能写的,代码中可能涉及一些无关内容,请酌情忽略。内容涉及:

重度依赖 ListenableFuture 实现取消机制

使用 TTL/ThreadLocal 实现上下文传播(实际上,如果能手动显式传递上下文最好)

之前文章提到的并发度控制也支持了取消机制

资源清理

为了使问题不过于复杂,删除了关于嵌套取消传播的内容,下篇文章会谈到,敬请期待。

背景在高并发系统中,我们经常需要并行执行大量子任务。然而,当出现以下情况时,继续执行剩余任务往往是资源浪费: 超时 :总体任务已超时,继续执行无意义快速失败(Fail-Fast) :某个子任务异常,整批任务结果已不可用主动取消 :业务逻辑判断不再需要结果 #后端 #掘金一周Java 原生的 Thread.interrupt 只能中断阻塞操作(如 sleep 、wait 、BlockingQueue.take ),无法中断正在执行 CPU 密集型代码的线程。因此,我们需要设计一套 协作式取消机制(Cooperative Cancellation) 。

设计目标统一的取消信号传递 :所有并行子任务共享同一个取消令牌支持多种取消原因 :超时、异常、主动取消轻量级检查点 :任务可以在关键节点主动检查取消状态延迟绑定 :取消令牌在任务提交后才绑定实际的 Future资源自动释放 :取消后自动清理未完成任务核心组件设计1. CancellationTokenState - 取消状态枚举首先定义清晰的状态枚举,避免魔法数字:

public enum CancellationTokenState {

/** 任务正在运行 */

RUNNING(0),

/** 任务成功完成 */

SUCCESS(1),

/** 空操作 */

NO_OP(2),

/** 因其他任务异常而取消(快速失败) */

FAIL_FAST_CANCELLED(-1),

/** 因超时而取消 */

TIMEOUT_CANCELLED(-2),

/** 因主动调用 cancel 而取消 */

MUTUAL_CANCELLED(-3);

private final int value;

/** * 判断是否需要取消子任务 * 负值状态表示需要取消 */ public boolean shouldCancelSubtasks { return this.value 设计要点 :

使用正值表示正常状态,负值表示取消状态shouldCancelSubtasks 方法提供语义化的判断接口C 2. CancellationToken - 取消令牌取消令牌是整个机制的核心,负责:

跟踪任务批次的整体状态传递取消信号支持延迟绑定@NoArgsConstructor

public class CancellationToken {

// 使用 SettableFuture 支持延迟绑定

private final SettableFuture