在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

一、前置思考

HarmonyOS的ArkUI是单线程渲染模型:UI更新只能在主线程执行,任何阻塞主线程超过16.67ms的操作都会导致丢帧。这时候多线程就成了"标配"——把计算密集型任务扔到后台线程,主线程专注UI。

但HarmonyOS的多线程方案和Android/iOS不一样:

  • 没有Java的Thread类
  • 没有iOS的GCD(Grand Central Dispatch)
  • 有的是 TaskPoolWorker 两套并发方案

本文将深入对比这两套方案,给出工业级的调度策略。

二、核心原理

2.1 TaskPool vs Worker对比

维度 TaskPool Worker
定位 短任务并发池 长生命周期后台线程
线程模型 线程池复用 独立线程
创建开销 低(复用池中线程) 高(独立创建)
生命周期 任务结束即释放 长期存活,需手动销毁
通信方式 @Concurrent函数调用 postMessage/onMessage
数量限制 无(自动调度) 最多8个
适用场景 图片解码、排序、加密 持续监听、大文件传输

2.3 TaskPool使用模式

import { taskpool } from '@kit.ArkTS';

@Concurrent
function decodeImage(data: ArrayBuffer): ImageBitmap {
  // 在TaskPool线程执行
  const decoder = image.createImageSource(data);
  // ...
  return bitmap;
}

// 主线程调用
const task: taskpool.Task = new taskpool.Task(decodeImage, rawData);
taskpool.execute(task).then((result: Object) => {
  const bitmap: ImageBitmap = result as ImageBitmap;
  // 更新UI
});

2.4 Worker使用模式

import { worker } from '@kit.ArkTS';

// 创建Worker
const workerInstance: worker.ThreadWorker =
  new worker.ThreadWorker('entry/ets/workers/MyWorker.ets');

// 发送消息
workerInstance.postMessage({ cmd: 'start', data: largeData });

// 接收结果
workerInstance.onmessage = (e: MessageEvents): void => {
  const result: Object = e.data;
  // 更新UI
};

// 销毁
workerInstance.terminate();

2.5 @Concurrent装饰器约束

  • 只能装饰全局函数,不能装饰类方法
  • 参数和返回值必须是可序列化类型
  • 函数内不能访问闭包变量
  • 不能调用UI相关API

三、企业级实战落地

本Demo演示:

场景 方案 演示内容
图片处理 TaskPool 模拟图片解码/压缩
数据排序 TaskPool 10000条数据排序
文件监听 Worker 模拟大文件传输进度
Worker通信 postMessage 双向消息
线程数对比 多任务并发 3个Task vs 3个Worker

四、调度策略

任务类型 推荐方案 理由
耗时<100ms 主线程 线程切换开销可能更大
100ms~1s TaskPool 低开销+自动调度
>1s的持续任务 Worker 独立线程避免阻塞池
需要持续通信 Worker postMessage双向通道
大量并发短任务 TaskPool 线程池复用效率高

五、避坑速查

现象 解决
@Concurrent函数访问this 编译报错 用全局函数,数据通过参数传递
Worker文件路径错误 Worker创建失败 路径格式:entry/ets/workers/...
Worker未terminate 内存泄漏 aboutToDisappear中terminate
TaskPool中抛异常不捕获 主线程无响应 .catch()处理
Worker数量超8 创建失败 复用已有Worker或改用TaskPool

六、总结

**口诀:短任务用TaskPool,长任务用Worker。**不要在一个应用中创建超过4个Worker,大多数场景TaskPool已经足够。

对应Demo文件:entry/src/main/ets/pages/ThreadSchedulingDemo.ets

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐