源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd
开天辟地 HarmonyOS(鸿蒙) - ArkTS 多线程: Worker(工作线程)
示例如下:
pages\arkts\concurrent\WorkerDemo.ets
/** Worker - 工作线程* 需要手动管理* 线程之间的通信是基于消息传递的,传递的消息必须是可序列化的** 自动创建 worker 线程文件的方法:打开 DevEco Studio 然后依次点击 File -> New -> Worker* 手动创建 worker 线程文件的方法:* 1、在 /src/main/ets/ 目录层级之下创建一个 .ets 文件,本例创建的文件是 /src/main/ets/workers/myworker.ets* 2、编辑 build-profile.json5 文件,并添加类似如下的内容* {* "apiType": "stageMode",* "buildOption": {* "sourceOption": {* "workers": [* './src/main/ets/workers/myworker.ets'* ]* }* }* }*** 注:* 1、无法用 Previewer 测试 Worker,需要用模拟器或真机* 2、关于 Promise 和 async/await 请参见 arkts/advanced/Promise.ets, arkts/advanced/AsyncAwait.ets 中的相关说明*/import { TitleBar } from '../../TitleBar';
import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';@Entry
@Component
struct WorkerDemo {@State message:string = ""build() {Column({space:10}) {TitleBar()Text(this.message).fontSize(16)Button("click me").fontSize(16).onClick(() => {this.message += `start\n`// 通过指定的 worker 线程文件创建工作线程对象(注:此处的文件路径要省略 src/main/)let threadWorker = new worker.ThreadWorker('entry/ets/workers/myworker.ets');// 接收到工作线程传递过来的消息后的回调threadWorker.onmessage = (e: MessageEvents) => {// e.data 就是工作线程传递过来的消息this.message += `onmessage:${e.data}\n`}// 工作线程被销毁后的回调(code 为 0 代表正常退出,code 为 1 代表异常退出)threadWorker.onexit = (code: number) => {this.message += `onexit:${code}\n`}// 工作线程运行中出现异常后的回调threadWorker.onerror = (err: ErrorEvent) => {this.message += `onerror:${err.message}\n`}// 传递指定的消息给工作线程threadWorker.postMessage("main to worker");})}}
}
\entry\src\main\ets\workers\myworker.ets
import { worker, ThreadWorkerGlobalScope, MessageEvents } from '@kit.ArkTS';// 创建一个用于当前工作线程与宿主线程之间通信的对象
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;// 接收到宿主线程传递过来的消息后的回调
workerPort.onmessage = async (e: MessageEvents) => {await new Promise<void>((r) => { setTimeout(r, 1000) })// e.data 就是工作线程传递过来的消息let message = e.data as string// 传递指定的消息给宿主线程workerPort.postMessage(`receive:${e.data}, send:worker to main`)// 销毁当前工作线程workerPort.close();
}
源码 https://github.com/webabcd/HarmonyDemo
作者 webabcd