ThreadScope 是 ThreadForge 的核心入口,负责任务提交、并发控制、失败传播、超时取消、资源清理。
- 类型:
public final class ThreadScope implements AutoCloseable - 线程安全:提交和等待可并发调用;
with*配置方法只能在首次提交/调度前调用
import io.threadforge.FailurePolicy;
import io.threadforge.RetryPolicy;
import io.threadforge.TaskPriority;
import io.threadforge.Task;
import io.threadforge.ThreadScope;
import java.time.Duration;
try (ThreadScope scope = ThreadScope.open()
.withFailurePolicy(FailurePolicy.FAIL_FAST)
.withScheduler(Scheduler.priority(8))
.withDefaultTaskPriority(TaskPriority.NORMAL)
.withRetryPolicy(RetryPolicy.fixedDelay(3, Duration.ofMillis(50)))
.withConcurrencyLimit(32)
.withDeadline(Duration.ofSeconds(2))) {
Task<Integer> a = scope.submit("a", () -> 1);
Task<Integer> b = scope.submit("b", () -> 2);
scope.await(a, b);
int sum = a.await() + b.await();
}scheduler = Scheduler.detect()failurePolicy = FailurePolicy.FAIL_FASTretryPolicy = RetryPolicy.noRetry()defaultTaskPriority = TaskPriority.NORMALdeadline = Duration.ofSeconds(30)- 自动传播
Context(提交/调度时捕获,执行时恢复) - 作用域关闭时自动取消未完成任务和计划任务
submit、schedule*、defer与close原子竞争:注册成功必由关闭流程处理,关闭先发生则注册抛IllegalStateException
创建新的作用域。
设置任务执行策略。
- 参数:
scheduler != null - 返回:当前 scope(链式调用)
- 异常:
NullPointerException:scheduler为nullIllegalStateException:配置已锁定(首次提交/调度后)
设置等待阶段的失败策略。
- 参数:
failurePolicy != null - 异常:同上(
NullPointerException/IllegalStateException)
设置任务默认重试策略。
- 参数:
retryPolicy != null - 默认:
RetryPolicy.noRetry() - 异常:同上(
NullPointerException/IllegalStateException)
设置默认任务优先级。
- 参数:
taskPriority != null - 默认:
TaskPriority.NORMAL - 说明:仅在
Scheduler.priority(...)下会影响队列顺序
设置并发上限(基于 Semaphore)。
- 参数:
limit > 0 - 语义:超过上限时,后续
submit会阻塞等待许可 - 异常:
IllegalArgumentException:limit <= 0IllegalStateException:配置已锁定
设置作用域截止时间。
- 参数:
deadline > 0 - 语义:
- 到期会触发 scope 取消
await/submit可能抛ScopeTimeoutException
- 异常:
NullPointerException:deadline == nullIllegalArgumentException:deadline <= 0IllegalStateException:配置已锁定
设置任务生命周期回调。
- 参数:
hook != null - 异常:
NullPointerException/IllegalStateException
启用 OpenTelemetry 任务追踪(默认 instrumentation name:io.threadforge)。
启用 OpenTelemetry 任务追踪,并指定 instrumentation name。
- 参数:
instrumentationName != null且非空白 - 异常:
NullPointerException:参数为nullIllegalArgumentException:参数为空白IllegalStateException:classpath 不存在 OpenTelemetry API 或配置已锁定
- 行为:
- 若已设置自定义
hook,会自动与 OpenTelemetry hook 组合 - 任一 hook 失败不影响另一个 hook 执行
- 若已设置自定义
获取当前调度策略。
获取当前失败策略。
获取当前重试策略。
获取默认任务优先级。
获取当前截止时间。
获取 scope 的取消令牌。
获取当前作用域的内置指标快照。
- 语义:
- 默认启用,无需额外配置
- 只返回快照,不阻塞任务执行线程
- 与
ThreadHook可并存,互不替代
注册关闭时的清理动作。
- 执行时机:
close()阶段 - 执行顺序:后注册先执行(LIFO)
- 异常:
NullPointerException:cleanup == nullIllegalStateException:scope 已关闭
提交匿名任务,自动命名为 task-<id>。
提交具名任务。
- 参数:
name != null且callable != null - 返回:任务句柄
Task<T> - 语义:
- 首次提交后锁定所有
with*配置 - 若设置并发上限,提交线程可能阻塞等待许可
- 如果等待许可过程中超时,会抛
ScopeTimeoutException - 如果等待许可过程中被取消,会抛
CancelledException - 会自动传播提交线程中的
Context
- 首次提交后锁定所有
提交无返回值的匿名任务,自动命名为 task-<id>。
提交无返回值的具名任务。
- 成功时
Task<Void>.await()返回null - 使用 scope 默认的任务优先级、重试策略和 deadline
- 异常、取消、上下文传播和观测语义与
Callable<T>任务一致 - 需要任务级优先级、重试或超时覆盖时,继续使用
Callable<T>重载
提交匿名任务,并指定优先级。
提交具名任务,并指定优先级。
提交匿名任务,并覆盖 scope 默认重试策略。
提交具名任务,并覆盖 scope 默认重试策略。
- 参数:
name != null,callable != null,retryPolicy != null
提交匿名任务,并设置该任务的独立超时。
提交具名任务,并设置该任务的独立超时。
提交匿名任务,并同时设置重试策略和任务级超时。
提交具名任务,并同时设置重试策略和任务级超时。
- 参数:
timeout == null或timeout > 0 - 超时行为:
- 仅该任务失败,异常类型为
TaskTimeoutException - 不会自动取消整个 scope(除非失败策略触发)
- 仅该任务失败,异常类型为
等待任务集合完成并按策略处理失败。
- 参数:
tasks != null - 返回:
Outcome - 空集合:返回
Outcome(total=0, succeeded=0, cancelled=0, failures=[]) - 典型异常:
ScopeTimeoutException:截止时间到达TaskTimeoutException:任务级超时RuntimeException:FAIL_FAST下的首个失败AggregateException:COLLECT_ALL下有失败
- 等待线程被中断时保留中断标记并立即抛
CancelledException,不会修改目标任务状态
await(Collection) 的可变参数重载。
等待同类型任务并返回结果列表。
- 返回顺序:与输入顺序一致
- 失败/取消项:返回
null - 返回集合:不可变列表
awaitAll(Collection) 的可变参数重载。
延迟执行一次(可返回值版本)。
- 语义:执行前先检查
token.throwIfCancelled()
延迟执行一次(Runnable 版本)。
固定频率周期执行。
固定延迟周期执行。
- 以上
schedule*通用约束:参数均不可为null,scope 需未关闭 - 首次调度同样会锁定配置
- 返回:
ScheduledTask,可取消 - 会自动传播调度提交线程中的
Context
关闭作用域并释放资源。
关闭流程:
- 触发 token 取消
- 取消全部计划任务
- 取消全部未完成任务
- 等待已启动的任务和计划工作真正退出
- 依次执行
defer清理(LIFO) - 取消截止时间监控任务
- 关闭由 scope 持有的执行器
异常语义:
close()本身是幂等的- 用户代码若忽略中断,
close()会继续等待,直到该代码自行退出;框架不会把逻辑取消伪装成物理结束 - 清理过程中的异常会聚合(通过
addSuppressed)后抛出 - 如果主流程已有异常(比如 try-with-resources 体内抛错),清理异常会以 suppressed 形式附加
详见:docs/api/control/FailurePolicy.md
FAIL_FAST:首错即抛并取消其余任务COLLECT_ALL:等待全部,失败后统一抛AggregateExceptionSUPERVISOR:不自动取消,失败写入OutcomeCANCEL_OTHERS:取消其余任务,不直接抛失败IGNORE_ALL:忽略失败,Outcome.failures()为空
重试策略详见:docs/api/control/RetryPolicy.md