Skip to content

并发 API ​

显式 Java 异步转换入口见 java.norm,完成、失败、取消与资源归属契约见 JavaCollectionTaskInteropTest。

std.concurrent.Task<T> 表示稍后完成的有类型操作,并实现 std.io.Resource。声明与重载以 tasks.norm 为准。

std.concurrent.async 在当前 TaskScope 中提交有返回值或 Void 工作;没有作用域时拒绝提交。TaskScope.start 由宿主实现,负责执行器与生命周期接入,标准库不依赖 UI。组件绑定该上下文后沿用 UI 队列、任务取消及清理屏障;无作用域的独立工作使用 startTask。标准库契约见 AsyncExecutionTest。

norm
var task = startTask { 20 } then { result * 2 } then { result + 2 }
var handled = task.then { printLine(result) } error { printLine(failure.message) }

startTask 提交虚拟线程工作后立即返回;Void 工作以 Unit 表示完成。then 在前一阶段成功后处理结果,error 处理前一阶段失败,包括成功回调抛出的异常。每次注册均返回独立的后续任务,注册不会在调用栈内执行回调。返回值重载保留精确结果类型,Void 回调产生 Unit;返回另一个 Task 时保留该返回类型,不自动展开嵌套任务。

默认后续阶段在完成通知后才调度到虚拟线程,未就绪阶段不预先启动等待线程。startTask(executor: executor) { ... } 可指定 TaskExecutor;工作仍在虚拟线程执行,后续成功及错误阶段继承该执行器。dispatch 必须将 action 排队执行,不能内联调用或静默丢弃;拒绝调度时应抛出异常,对应阶段会失败结束。任务创建时捕获当前 ResourceOwner,后续阶段继承该归属;GUI 仍需通过执行器连接 UI 队列。任务完成、取消或关闭后解除资源归属,并从执行实例的资源列表移除;已完成结果仍可读取。关闭 owner 可取消其持有的阶段,已关闭 owner 会拒绝新的阶段。Task 不延长执行实例的生命周期;取消一个后续阶段不会取消其前置任务或兄弟阶段。

执行实例关闭后,异步投递会在进入 Norm 代码前被拒绝;任务清理保持幂等,不会再次进入已关闭的执行实例。

既有 await() 返回完成值,失败进入 Norm Exception 流程;completed() 观察终态,cancel() 请求取消。语言级行为见 TaskExecutionTest,调度、取消和结果转换见 JvmJarBindingTaskTest。

指定 TaskExecutor 后,未接管结果的失败会排入该执行器,再调用其 report(error);默认实现抛出异常,GUI 执行器将其交给窗口错误报告。连接后续阶段、await、取消、显式关闭 都表示接管该任务;链末端的新失败仍可单独报告。资源自动释放不表示错误已处理。排队期间注册的处理器会抑制默认报告,已报告的错误不会因后来注册处理器而撤销。取消不作为未处理异常报告;没有指定执行器时,结果由调用者读取。

Java 并发类型保持其 java.base 名义身份,边界规则见 Java 绑定。长期应用入口可使用 awaitCancellation 等待取消或中断。

termination() 返回独立的 Task<Unit>? 清理完成通知:Norm 自己调度的工作退出执行体(包括 finally)后才完成,即使任务已被取消。尚未运行的工作取消或被执行器拒绝后也会完成该通知。它不继承组件的 ResourceOwner,关闭通知不会取消原工作;通知本身不代表另一个工作执行体。完成源不拥有执行体,其任务因此返回 null。该 API 用于资源关闭协调;UI 线程不应调用 await 阻塞等待。

外部事件通过 completion<T>() 创建可完成的任务源;声明见 completion.norm,跨线程完成、失败身份和关闭取消验证见 CompletionTest。

Norm 0.25