线程操作指南(API 12+)
数据由AI生成。
1. 开启线程执行异步操作
在鸿蒙ArkUI中,可以使用TaskDispatcher
来创建和管理线程。以下是几种常见的线程创建方式:
import taskpool from '@ohos.taskpool';
// 1. 使用全局默认任务池(并发线程池)
let globalTaskPool = taskpool.getGlobalTaskPool();
// 2. 创建专用任务池
let dedicatedTaskPool = new taskpool.TaskPool("MyDedicatedPool");
// 3. 执行异步任务
async function executeAsyncTask() {
// 定义一个要在子线程中执行的函数
function heavyComputation(param: number): number {
// 模拟耗时操作
for (let i = 0; i < 1000000000; i++) {}
return param * 2;
}
// 使用任务池执行
let task = new taskpool.Task(heavyComputation, 10);
let result = await taskpool.execute(task);
console.log(`计算结果: ${result}`);
}
2. 从子线程操作UI线程
在鸿蒙中,UI操作必须在主线程(UI线程)执行。要从子线程更新UI,可以使用TaskDispatcher
的asyncTask
或dispatch
方法:
import taskpool from '@ohos.taskpool';
import common from '@ohos.app.ability.common';
@Entry
@Component
struct MyComponent {
@State count: number = 0;
private context = getContext(this) as common.UIAbilityContext;
// 从子线程更新UI的方法
private updateUIFromWorker() {
// 1. 在子线程中执行耗时操作
function backgroundTask(): number {
// 模拟耗时计算
for (let i = 0; i < 100000000; i++) {}
return 42;
}
// 2. 创建任务
let task = new taskpool.Task(backgroundTask);
// 3. 执行任务并获取结果
taskpool.execute(task).then((result: number) => {
// 4. 使用UI任务分发器更新UI
this.context.uiTaskDispatcher.dispatch(() => {
this.count = result; // 安全地更新UI状态
});
});
}
build() {
Column() {
Text(`计数: ${this.count}`)
.fontSize(30)
Button('开始计算')
.onClick(() => {
this.updateUIFromWorker();
})
}
.width('100%')
.height('100%')
}
}
3. 线程类详细介绍
3.1 TaskPool 类
TaskPool
是鸿蒙提供的高性能任务池实现,主要方法包括:
// 创建任务池
let taskPool = new taskpool.TaskPool(name?: string);
// 执行任务
taskPool.execute(task: Task, priority?: Priority): Promise<Object>;
// 取消任务
taskPool.cancel(task: Task): void;
3.2 Task 类
表示一个可执行的任务:
// 创建任务
let task = new taskpool.Task(func: Function, ...args: Object[]);
// 属性
task.function; // 获取任务函数
task.args; // 获取任务参数
3.3 TaskDispatcher 类
任务分发器,用于指定任务执行的线程:
// 获取UI线程分发器
let uiDispatcher = context.uiTaskDispatcher;
// 获取并行任务分发器
let parallelDispatcher = context.parallelTaskDispatcher;
// 获取串行任务分发器
let serialDispatcher = context.serialTaskDispatcher;
// 常用方法
dispatcher.dispatch(task: Function): void;
dispatcher.delayDispatch(delay: number, task: Function): void;
dispatcher.asyncDispatch(task: Function): Promise<Object>;
4. 线程优先级
鸿蒙API 12+定义了以下线程优先级:
enum Priority {
HIGH, // 高优先级
DEFAULT, // 默认优先级
LOW // 低优先级
}
使用示例:
let task = new taskpool.Task(heavyComputation, 10);
taskpool.execute(task, taskpool.Priority.HIGH);
5. 线程间通信
除了通过UI任务分发器,还可以使用Emitter
进行线程间通信:
import emitter from '@ohos.events.emitter';
// 主线程中订阅事件
emitter.on("update_ui_event", (eventData) => {
this.count = eventData.data;
});
// 子线程中发布事件
function backgroundTask() {
// ...计算...
emitter.emit({
eventId: "update_ui_event",
data: 123
});
}
6. 注意事项
UI操作必须通过UI任务分发器(
uiTaskDispatcher
)执行避免在子线程中直接访问UI组件
长时间运行的任务应考虑使用
Worker
而非任务池注意线程安全问题,共享数据需要同步机制
合理使用线程优先级,避免优先级反转