第9章:多线程与并发
Worker线程
1. 基本概念
ArkTS中的Worker线程是一种独立于主线程的后台执行环境,用于处理耗时操作(如复杂计算、大数据处理等),避免阻塞UI线程。关键特性包括:
- 独立运行环境:拥有自己的内存空间和事件循环
- 通信机制:通过消息传递与主线程交互(postMessage/onmessage)
- 生命周期管理:可手动创建和终止
2. 创建Worker线程
2.1 创建Worker文件
// workers/calculation.worker.ts
const workerPort = worker.workerPort;
workerPort.onmessage = (e: MessageEvent) => {
const data = e.data;
// 执行耗时计算
const result = heavyCalculation(data);
workerPort.postMessage(result);
};
function heavyCalculation(input: number[]): number {
// 模拟复杂计算
return input.reduce((a, b) => a + b, 0);
}
2.2 主线程调用
// 主线程代码
const worker = new Worker("workers/calculation.worker.ts");
// 发送数据
worker.postMessage([1, 2, 3, 4, 5]);
// 接收结果
worker.onmessage = (e: MessageEvent) => {
console.log("计算结果:", e.data);
worker.terminate(); // 使用后销毁
};
3. 通信机制
| 通信方式 | 描述 | 示例 |
|---|---|---|
| 单向通信 | 主线程→Worker或Worker→主线程 | worker.postMessage() |
| 双向通信 | 通过消息回调实现交互 | onmessage事件处理 |
| 传输大型数据 | 使用Transferable对象 | postMessage(buffer, [buffer]) |
4. 生命周期管理
// 创建Worker
const worker = new Worker("path/to/worker");
// 主动终止
worker.terminate();
// 错误处理
worker.onerror = (e) => {
console.error("Worker错误:", e.message);
};
5. 使用场景
CPU密集型任务
- 图像/视频处理
- 复杂算法计算
IO操作
- 大数据文件读写
- 本地数据库操作
定时任务
- 后台定时数据同步
6. 注意事项
- 内存隔离:Worker无法直接访问DOM或主线程变量
- 性能开销:创建Worker有约5-10ms的初始化延迟
- 调试技巧:
// arkconfig.json { "worker": { "debug": true // 启用Worker调试模式 } }
7. 完整示例:素数计算
// prime.worker.ts
worker.workerPort.onmessage = (e) => {
const max = e.data;
const primes = findPrimes(max);
worker.workerPort.postMessage(primes);
};
function findPrimes(max: number): number[] {
// 实现素数筛选算法...
}
// 主线程调用
const primeWorker = new Worker("workers/prime.worker.ts");
primeWorker.postMessage(1000000);
primeWorker.onmessage = (e) => {
console.log("找到素数数量:", e.data.length);
};
8. 最佳实践
- 复用Worker:避免频繁创建/销毁
- 批量处理:合并多次消息发送
- 错误边界:
worker.onmessageerror = () => { // 处理消息解析错误 }; - 资源释放:在页面卸载时调用
terminate()
