文章目录前言它们解决同一件事决策树直接对号入座TaskPool 骨架回顾代码实现Worker 骨架核心代码对比总表常见误区小白必踩完整可运行示例TaskPool vs Worker完整示例写在最后前言前面讲 TaskPool 那篇说过HarmonyOS 后台干活有两套TaskPool和Worker。它们都能把重活丢出主线程但设计哲学不同。经常有人问我到底该用哪个这篇文章不啰嗦直接给你决策树 对比 各自的代码骨架你照着对号入座。它们解决同一件事主线程不能卡重活要后台跑。TaskPool 和 Worker 都是后台线程的实现区别在于怎么管理线程TaskPool线程池你只管扔任务池子帮你调度、复用线程。Worker你手动 new 一个独立线程长期驻留自己管生命周期。决策树直接对号入座你的后台逻辑是 ├─ 跑一次、算完就完、要结果回来 │ → 用 TaskPool简单、省心 ├─ 需要长期驻留、反复双向通信 │ → 用 Worker如常驻音视频处理线程 ├─ 任务特别多、零散、短 │ → 用 TaskPool池化复用不爆线程 └─ 要和主线程持续聊天发消息来回 → 用 Workermessage 通信TaskPool 骨架回顾适合一次性重计算代码实现import{taskpool}fromkit.ExecutionKitfunctioncalc(n:number):number{/* 耗时 */returnn*2}consttasknewtaskpool.Task(calc,1000000)constresultawaittaskpool.execute(task)特点顶层函数、参数可序列化、execute返回 Promise。用完即弃不用管线程。Worker 骨架适合常驻、持续通信核心代码// worker 文件独立线程逻辑import{worker}fromkit.ArkTSconstparentworker.workerPort parent.onmessage(e){constresheavyProcess(e.data)// 处理主线程发来的数据parent.postMessage(res)// 把结果发回去}// 主线程constwnewworker.ThreadWorker(entry/ets/workers/myworker.ts)w.onmessage(e){console.info(收到结果,e.data)}w.postMessage({cmd:start,payload:data})// 发任务给 worker要点Worker 是独立文件myworker.ts里面写后台逻辑。双方程序通过postMessage/onmessage互相发消息可反复通信。用完要w.terminate()销毁否则线程一直占着。对比总表维度TaskPoolWorker生命周期池化自动回收手动 new/terminate通信只回最终结果持续双向 message代码位置顶层函数独立 worker 文件适用短任务、批处理长驻、常通信常见误区小白必踩误区说明长驻常通信却用 TaskPoolTaskPool 用完即弃需要持续双向通信得上 Worker。一次性计算硬开 WorkerWorker 生命周期重单次重计算用 TaskPool 更省心。Worker 不terminate用完不销毁线程一直占着资源。下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲改一改文末「动手改一改」里的参数亲眼看看效果。完整可运行示例TaskPool vs Worker短任务用 TaskPool长驻任务用 Worker。完整示例// TaskPool派发一次性任务自动回收import{taskpool}fromkit.ArkTSConcurrentfunctionshortTask(n:number):number{returnn*2}// Worker长驻后台可反复收发消息// worker.tsimport{worker}fromkit.ArkTSconstparentworker.workerPort parent.onmessage(e){parent.postMessage(e.data*2)}你会看到什么TaskPool适合「派出去、拿结果、完事」的短任务无需手动管理生命周期Worker适合需要长期驻留、反复通信的场景如持续定位。两者都不阻塞 UI 线程。动手改一改把一次性计算从 Worker 改用 TaskPool体会代码量差异。给 Worker 增加「心跳」消息维持长连接。用 TaskPool 的taskpool.execute串行/并行组合做流水线。写在最后选型记住一次性计算 → TaskPool长驻常通信 → Worker。绝大多数卡 UI 的计算用 TaskPool 就够了别上来就开 Worker——Worker 的生命周期和通信管理更重用错了反而添乱。回去看看你项目里那些主线程重活先判断是一次性的还是常驻的对号入座选一个。90% 的情况TaskPool 是答案。