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
Powered by 天博体育APP官方版 @2013-2022 RSS地图 HTML地图
Copyright Powered by365站群 © 2013-2024