线程操作指南(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,可以使用TaskDispatcherasyncTaskdispatch方法:

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. 注意事项

  1. UI操作必须通过UI任务分发器(uiTaskDispatcher)执行

  2. 避免在子线程中直接访问UI组件

  3. 长时间运行的任务应考虑使用Worker而非任务池

  4. 注意线程安全问题,共享数据需要同步机制

  5. 合理使用线程优先级,避免优先级反转