HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第53天,使用Worker进行线程间通信

发布于 1周前 作者 songsunli 来自 鸿蒙OS

HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第53天,使用Worker进行线程间通信 1、使用Emitter进行线程间通信

Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。

Emitter的开发步骤如下:

  1. 订阅事件
import emitter from "@ohos.events.emitter";

// 定义一个eventId为1的事件
let event = {
    eventId: 1
};

// 收到eventId为1的事件后执行该回调
let callback = (eventData) => {
    console.info('event callback');
};

// 订阅eventId为1的事件
emitter.on(event, callback);
  1. 发送事件
import emitter from "@ohos.events.emitter";

// 定义一个eventId为1的事件,事件优先级为Low
let event = {
    eventId: 1,
    priority: emitter.EventPriority.LOW
};

let eventData = {
    data: {
        "content": "c",
        "id": 1,
        "isEmpty": false,
    }
};

// 发送eventId为1的事件,事件内容为eventData
emitter.emit(event, eventData);

2、使用Worker进行线程间通信

Worker是与主线程并行的独立线程。创建Worker的线程被称为宿主线程,Worker工作的线程被称为Worker线程。创建Worker时传入的脚本文件在Worker线程中执行,通常在Worker线程中处理耗时的操作,需要注意的是,Worker中不能直接更新Page。

Worker的开发步骤如下:

  1. 在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息。
"buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/workers/worker.ts"
      ]
    }
}
  1. 根据build-profile.json5中的配置创建对应的worker.ts文件。
import worker from '@ohos.worker';

let parent = worker.workerPort;

// 处理来自主线程的消息
parent.onmessage = function(message) {
    console.info("onmessage: " + message)
    // 发送消息到主线程
    parent.postMessage("message from worker thread.")
}
  1. 主线程中使用如下方式初始化和使用worker

Stage模型:

import worker from '@ohos.worker';

let wk = new worker.ThreadWorker("entry/ets/workers/worker.ts");

// 发送消息到worker线程
wk.postMessage("message from main thread.")

// 处理来自worker线程的消息
wk.onmessage = function(message) {
    console.info("message from worker: " + message)

    // 根据业务按需停止worker线程
    wk.terminate()
}

FA模型:

import worker from '@ohos.worker';

let wk = new worker.ThreadWorker("../workers/worker.ts");

// 发送消息到worker线程
wk.postMessage("message from main thread.")

// 处理来自worker线程的消息
wk.onmessage = function(message) {
    console.info("message from worker: " + message)

    // 根据业务按需停止worker线程
    wk.terminate()
}

说明:

  • build-profile.json5中配置的worker.ts的相对路径都为./src/main/ets/workers/worker.ts时,在Stage模型下创建worker需要传入路径entry/ets/workers/worker.ts;
  • 在FA模型下创建worker需要传入路径…/workers/worker.ts。
  • 主线程与Worker线程间支持的数据类型参考序列化支持类型

更多关于HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第53天,使用Worker进行线程间通信的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

话说这种可以复制编码的板块是如何添加的呢?

更多关于HarmonyOS 鸿蒙Next ArkTS语言教程入门学习第53天,使用Worker进行线程间通信的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS中,ArkTS语言支持使用Worker进行线程间通信。Worker是一种多线程机制,允许在后台执行耗时操作,避免阻塞主线程。通过Worker,开发者可以在主线程和Worker线程之间传递消息,实现异步通信。

要使用Worker,首先需要创建一个Worker文件,例如worker.ts。在该文件中,定义Worker线程的逻辑。Worker线程通过onmessage事件监听主线程发送的消息,并通过postMessage方法向主线程发送消息。

在主线程中,通过new Worker()创建Worker实例,并指定Worker文件的路径。主线程可以通过postMessage方法向Worker线程发送消息,并通过onmessage事件监听Worker线程的响应。

以下是一个简单的示例:

worker.ts:

onmessage = function(e) {
    const data = e.data;
    // 处理数据
    const result = data * 2;
    postMessage(result);
};

main.ts:

const worker = new Worker('worker.ts');

worker.onmessage = function(e) {
    console.log('Received from worker:', e.data);
};

worker.postMessage(10); // 发送数据到Worker线程

在这个示例中,主线程向Worker线程发送数字10,Worker线程接收到数据后将其乘以2,并将结果20发送回主线程。主线程通过onmessage事件接收到结果并打印。

通过Worker,开发者可以在HarmonyOS中实现高效的线程间通信,提升应用的性能和响应速度。

在第53天的HarmonyOS鸿蒙Next ArkTS语言教程中,您将学习如何使用Worker进行线程间通信。Worker是一种后台线程,允许您在不阻塞主线程的情况下执行耗时操作。通过postMessage方法,主线程可以向Worker发送消息,而Worker通过onmessage事件监听器接收并处理这些消息。同样,Worker也可以通过postMessage向主线程发送处理结果。这种机制有效提升了应用的响应速度和性能。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!