如何在鸿蒙系统中实现多线程操作?

鸿蒙系统支持多线程开发,开发者需要了解如何在鸿蒙中创建和管理多线程,以实现高并发的操作。

harmonyos
HarmonyOS NEXT
2024-11-20 14:05:16
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
因为活着就一定行

ArkTS 目前支持两种多线程并发的能力,分别是 TaskPool 或 Worker 能力,TaskPool与Worker两种多线程并发能力均是基于 ​Actor并发模型​实现的。

  1. 关于 TaskPool 能力

TaskPool在Worker之上实现了调度器和Worker线程池。在主线程(ArkTS Main Thread)中调用execute接口会将待执行的任务方法及参数信息,根据设置的任务优先级放入任务队列(TaskQueue)中等待调度执行。

// Index.ets代码
import { taskpool} from '@kit.ArkTS';
import Handle from './Handle'; // 返回静态句柄

// 步骤1: 定义并发函数,内部调用同步方法
@Concurrent
async function func(num: number): Promise<number> {
  // 调用静态类对象中实现的同步等待调用
  // 先调用syncSet方法并将其结果作为syncSet2的参数,模拟同步调用逻辑
  let tmpNum: number = Handle.syncSet(num);
  console.info("this is Child_Thread")
  return Handle.syncSet2(tmpNum);
}

// 步骤2: 创建任务并执行
async function asyncGet(): Promise<void> {
  // 创建task、task2并传入函数func
  let task: taskpool.Task = new taskpool.Task(func, 1);
  let task2: taskpool.Task = new taskpool.Task(func, 2);
  // 执行task、task2任务,await保证其同步执行
  let res: number = await taskpool.execute(task) as number;
  let res2: number = await taskpool.execute(task2) as number;
  // 打印任务结果
  console.info("taskpool: task res is: " + res);
  console.info("taskpool: task res2 is: " + res2);
}

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(async () => {
            // 步骤3: 执行并发操作
            asyncGet();
            let num: number = Handle.syncSet(100);
            console.info("this is Main_Thread!")
          })
      }
      .width('100%')
      .height('100%')
    }
  }
}


  1. 关于 Worker 能力

Worker拥有独立的运行环境,每个Worker线程和主线程一样拥有自己的内存空间、消息队列(MessageQueue)、事件轮询机制(EventLoop)、调用栈(CallStack)


// Index.ets
import { worker } from '@kit.ArkTS';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            let w: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
            w.onmessage = (): void => {
              // 接收Worker子线程的结果
            }
            w.onerror = (): void => {
              // 接收Worker子线程的错误信息
            }
            // 向Worker子线程发送Set消息
            w.postMessage({'type': 0, 'data': 'data'})
            // 向Worker子线程发送Get消息
            w.postMessage({'type': 1})
            // ...
            // 根据实际业务,选择时机以销毁线程
            w.terminate()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}


分享
微博
QQ
微信
回复
2024-12-03 22:41:25
相关问题
HarmonyOS 数据库多线程操作
207浏览 • 1回复 待解决
如何使用taskpool实现多线程
1175浏览 • 1回复 待解决
多线程EGL如何共享Context
458浏览 • 1回复 待解决
如何实现多线程数据共享
2245浏览 • 1回复 待解决
什么是系统多线程模型
423浏览 • 1回复 待解决
ArkTs多线程方案如何保证线程安全
2599浏览 • 2回复 待解决
如何在进行并发操作时保证线程安全
363浏览 • 1回复 待解决