一、核心机制对比(API20)
| 对比维度 | TaskPool | Worker |
|---|---|---|
| 线程管理 | 自动线程池调度(支持动态扩缩容) | 需手动创建/销毁线程(上限64个) |
| 参数传递 | 直接传递可序列化数据(支持ArrayBuffer转移) | 需封装消息对象(单参数传递) |
| 生命周期 | 任务执行后自动回收(超3分钟任务强制回收) | 需手动调用terminate()释放资源 |
| 高级特性 | 支持优先级、取消、依赖关系、任务组 | 仅支持线程优先级(API18+) |
// TaskPool典型用法(带优先级)
import { taskpool } from '@kit.ArkTS';
@Concurrent
function imageProcess(data: ArrayBuffer): void { /*...*/ }
taskpool.execute(imageProcess, buffer, taskpool.Priority.HIGH);
// Worker典型用法
const worker = new worker.ThreadWorker('entry/workers/MyWorker.ts');
worker.postMessage({ type: 'process', data: buffer });
二、适用场景分析
1. TaskPool推荐场景
-
轻量级并行计算
如图片分块处理、数据分片统计等无状态任务// 图像分块处理示例 const taskGroup = new taskpool.TaskGroup(); for (let i=0; i<8; i++) { const slice = buffer.slice(i*chunkSize, (i+1)*chunkSize); taskGroup.addTask(new taskpool.Task(imageProcess, slice)); } taskpool.execute(taskGroup); -
需要任务控制
涉及优先级调度(如后台下载管理)、任务取消(如滑动取消预加载)
2. Worker推荐场景
-
长时状态任务
如持续运行的音视频编解码、数据库事务处理// Worker线程持续处理音频流 workerPort.onmessage = (e) => { const audioData = e.data; processAudio(audioData); // 需要保持处理状态 workerPort.postMessage(result); }; -
句柄型资源操作
需长期持有句柄的场景(如网络长连接、文件流操作)
三、选型决策指南
-
任务时长判断
≤3分钟且无状态 → TaskPool
>3分钟或需保持状态 → Worker -
线程管理复杂度
希望零管理成本 → TaskPool
需要精细控制 → Worker -
特殊功能需求
需优先级/取消/依赖 → TaskPool
需长期资源持有 → Worker