文档管理中心
我的

您当前正在浏览HarmonyOS最新文档,覆盖已发布的所有API版本,可在API参考中筛选您使用的API版本。详细的版本配套关系请参考版本说明。

指南与API参考API参考应用框架ArkTS(方舟编程语言)ArkTS API@ohos.worker (启动一个Worker)

@ohos.worker (启动一个Worker)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

Worker是与宿主线程并行的独立线程。创建Worker的线程称为宿主线程,Worker自身的线程称为Worker线程。创建Worker时传入的URL文件在Worker线程中执行,可以处理耗时操作,但不能直接操作UI。

Worker的主要作用是为应用程序提供多线程运行环境,使应用程序在执行过程中与宿主线程分离,在后台线程中运行脚本处理耗时操作,避免计算密集型或高延迟任务阻塞宿主线程。由于Worker一旦创建不会主动销毁,若不处于任务状态会一直运行,造成资源浪费,应及时销毁空闲的Worker。

Worker的上下文环境和UI线程的上下文环境是独立的,Worker线程不支持UI操作。

请查看Worker注意事项,了解Worker使用过程中的相关注意点。

说明

本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。

导入模块

收起
自动换行
深色代码主题
复制
  1. import { worker } from '@kit.ArkTS';

常量

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 说明
workerPort9+ ThreadWorkerGlobalScope 是

Worker线程用于与宿主线程通信的对象。

元服务API:从API version 11开始,该接口支持在元服务中使用。

parentPort(deprecated) DedicatedWorkerGlobalScope 是

Worker线程用于与宿主线程通信的对象。

说明:从API version 7开始支持,从API version 9开始废弃,建议使用workerPort替代。

WorkerOptions

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

Worker构造函数的选项,用于为Worker添加其他信息。

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
type 'classic' | 'module' 否 是

Worker执行脚本的模式类型,暂不支持module类型,默认值为"classic"。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

name string 否 是

Worker的名称。

默认值为undefined,此时线程名称为'WorkerThread'。

非默认值情况下,对应的线程名称带有'WorkerThread_'前缀。比如name为'testName'时,对应的线程名称为'WorkerThread_testName'。

线程名称可通过HeapMemoryInfo的threadName获取。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

shared boolean 否 是

表示Worker共享功能,此接口暂不支持。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

priority18+ ThreadWorkerPriority 否 是

表示Worker线程优先级。默认值为MEDIUM。

元服务API: 从API version 18开始,该接口支持在元服务中使用。

ThreadWorkerPriority18+

Phone18+PC/2in118+Tablet18+TV19+Wearable18+

Worker线程的优先级枚举,各优先级对应关系请参考QoS等级定义。

系统能力: SystemCapability.Utils.Lang

展开
名称 值 说明
HIGH 0

适用于打开文档等用户触发并且可以看到进展的任务,任务在几秒钟之内完成。对应QOS_USER_INITIATED。

元服务API:从API version 18开始,该接口支持在元服务中使用。

MEDIUM 1

任务完成需要几秒钟。是ThreadWorkerPriority的默认值。对应QOS_DEFAULT。

元服务API:从API version 18开始,该接口支持在元服务中使用。

LOW 2

适用于下载等不需要立即看到响应效果的任务,任务完成需要几秒到几分钟。对应QOS_UTILITY。

元服务API:从API version 18开始,该接口支持在元服务中使用。

IDLE 3

适用于数据同步等用户不可见的后台任务,任务完成需要几分钟甚至几小时。对应QOS_BACKGROUND。

元服务API:从API version 18开始,该接口支持在元服务中使用。

DEADLINE20+ 4

适用于页面加载等越快越好的关键任务,任务几乎是瞬间完成的。对应QOS_DEADLINE_REQUEST。

元服务API:从API version 20开始,该接口支持在元服务中使用。

VIP20+ 5

适用于UI线程、动画渲染等用户交互任务,任务是即时的。对应QOS_USER_INTERACTIVE。

元服务API:从API version 20开始,该接口支持在元服务中使用。

ThreadWorker9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

使用以下方法前,需先构造ThreadWorker实例。ThreadWorker类继承自WorkerEventTarget。

属性

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
onexit9+ (code: number) => void 否 是

回调函数。表示Worker线程销毁时被调用的事件处理程序,该处理程序在宿主线程中执行。回调函数的code参数类型为number,异常退出时code为1,正常退出时code为0。默认值为undefined。

以下错误码的详细介绍请参见语言基础类库错误码。

- 10200004:The Worker instance is not running.

- 10200005:The called API is not supported in the worker thread.

元服务API:从API version 11开始,该属性支持在元服务中使用。

onerror9+ (err: ErrorEvent) => void 否 是

回调函数,用于处理onmessage回调函数中同步代码产生的异常,处理程序在宿主线程中执行。回调函数的err类型为ErrorEvent,表示收到的异常数据。默认值为undefined。

以下错误码的详细介绍请参见语言基础类库错误码。

- 10200004:The Worker instance is not running.

- 10200005:The called API is not supported in the worker thread.

元服务API:从API version 11开始,该属性支持在元服务中使用。

onAllErrors18+ ErrorCallback 否 是

回调函数。表示Worker线程生命周期内发生异常被调用的事件处理程序,处理程序在宿主线程中执行。默认值为undefined。

以下错误码的详细介绍请参见语言基础类库错误码。

- 10200004:The Worker instance is not running.

- 10200005:The called API is not supported in the worker thread.

元服务API:从API version 18开始,该属性支持在元服务中使用。

onmessage9+ (event: MessageEvents) => void 否 是

回调函数。表示宿主线程接收到来自其创建的Worker通过workerPort.postMessage或workerPort.postMessageWithSharedSendable接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中event类型为MessageEvents,表示收到的Worker线程发送的消息数据。默认值为undefined。

以下错误码的详细介绍请参见语言基础类库错误码。

- 10200004:The Worker instance is not running.

- 10200005:The called API is not supported in the worker thread.

元服务API:从API version 11开始,该属性支持在元服务中使用。

onmessageerror9+ (event: MessageEvents) => void 否 是

回调函数。用于处理Worker对象接收到的无法被序列化的消息。该处理程序在宿主线程中执行,event类型为MessageEvents,表示收到的Worker消息数据。默认值为undefined。

以下错误码的详细介绍请参见语言基础类库错误码。

- 10200004:The Worker instance is not running.

- 10200005:The called API is not supported in the worker thread.

元服务API:从API version 11开始,该属性支持在元服务中使用。

使用Worker模块时,API version 18及之后的版本建议在宿主线程中注册onAllErrors回调,以捕获Worker线程生命周期内的各种异常。API version 18之前的版本应注册onerror回调。如果未注册onAllErrors或onerror回调,当Worker线程出现异常时会发生崩溃问题。注意,onerror接口仅能捕获onmessage回调中的同步异常,捕获异常后,Worker线程将进入销毁流程,无法继续使用。

onAllErrors接口与onerror接口之间的行为差异如下:

  1. 异常捕获范围

    onAllErrors接口可以捕获Worker线程的onmessage回调、timer回调以及文件执行等流程中产生的全局异常。

    onerror接口仅能捕获Worker线程的onmessage回调中同步方法产生的异常,无法捕获多线程回调和模块化相关异常。

  2. 异常捕获后的线程状态

    onAllErrors接口捕获异常后,Worker线程仍然存活并可以继续使用。这使开发者可以在捕获异常后执行其他操作,无需担心线程终止。

    onerror接口捕获异常后,Worker线程会进入销毁流程,无法继续使用。这意味着在onerror触发后,Worker线程将被终止,后续操作将无法进行。

  3. 适用场景

    onAllErrors接口适用于捕获Worker线程中所有类型异常的场景,特别是确保异常发生后Worker线程仍能继续运行的复杂场景。

    onerror接口适用于只需要捕获onmessage回调中同步异常的简单场景。由于捕获异常后线程会被销毁,适用于不需要继续使用Worker线程的情况。

    推荐使用onAllErrors接口,因为它提供了更全面的异常捕获能力,并且不会导致线程终止。

constructor9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

constructor(scriptURL: string, options?: WorkerOptions)

ThreadWorker构造函数。

元服务API:从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
scriptURL string 是

Worker线程文件的路径。

路径规则详细参考文件路径注意事项。

options WorkerOptions 否 Worker构造的选项。此参数不填时,对应各属性取其默认值。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200003 Worker initialization failed.
10200007 The worker file path is invalid.

示例:

以下示例展示了在Stage模型的entry模块Index.ets文件中加载Worker线程文件的方法,使用Library加载Worker线程文件的场景参考文件路径注意事项。

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. // worker文件所在路径:"entry/src/main/ets/workers/worker.ets"
  4. const workerInstance = new worker.ThreadWorker('entry/ets/workers/worker.ets', {name: "WorkerThread"});

postMessage9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessage(message: Object, transfer: ArrayBuffer[]): void

宿主线程通过转移对象所有权的方式向Worker线程发送消息。

系统能力: SystemCapability.Utils.Lang

元服务API:从API version 11开始,该接口支持在元服务中使用。

参数:

展开
参数名 类型 必填 说明
message Object 是 发送至Worker的数据,该数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。
transfer ArrayBuffer[] 是 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用,数组不可传入null。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200006 An exception occurred during serialization.

示例:

收起
自动换行
深色代码主题
复制
  1. // Worker.ets
  2. import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
  3. // 创建worker线程中与宿主线程通信的对象
  4. const workerPort = worker.workerPort;
  5. // worker线程接收宿主线程信息
  6. workerPort.onmessage = (e: MessageEvents): void => {
  7. // data:宿主线程发送的信息
  8. let data: ArrayBuffer = e.data;
  9. // 往收到的buffer里写入数据
  10. const view = new Int8Array(data).fill(3);
  11. // worker线程向宿主线程发送信息
  12. workerPort.postMessage(view);
  13. }
  14. // worker线程发生error的回调
  15. workerPort.onerror = (err: ErrorEvent) => {
  16. console.error("worker.ets onerror" + err.message);
  17. }
收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
  3. @Entry
  4. @Component
  5. struct Index {
  6. @State message: string = 'Hello World';
  7. build() {
  8. Row() {
  9. Column() {
  10. Text(this.message)
  11. .fontSize(50)
  12. .fontWeight(FontWeight.Bold)
  13. .onClick(() => {
  14. // 宿主线程中创建Worker对象
  15. const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
  16. // 宿主线程向worker线程传递信息
  17. const buffer = new ArrayBuffer(8);
  18. workerInstance.postMessage(buffer, [buffer]);
  19. // 此时buffer的所有权转移到了worker线程,在宿主线程中不可用
  20. // const view = new Int8Array(buffer).fill(3);
  21. // 宿主线程接收worker线程信息
  22. workerInstance.onmessage = (e: MessageEvents): void => {
  23. // data:worker线程发送的信息
  24. let data: Int8Array = e.data;
  25. console.info("main thread data is " + data);
  26. // 销毁Worker对象
  27. workerInstance.terminate();
  28. }
  29. // 在调用terminate后,执行onexit
  30. workerInstance.onexit = (code) => {
  31. console.info("main thread terminate");
  32. }
  33. // 监听Worker错误
  34. workerInstance.onAllErrors = (err: ErrorEvent) => {
  35. console.error("main error message " + err.message);
  36. }
  37. })
  38. }
  39. .width('100%')
  40. .height('100%')
  41. }
  42. }
  43. }

postMessage9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessage(message: Object, options?: PostMessageOptions): void

宿主线程可以通过转移对象所有权或拷贝数据的方式向Worker线程发送消息。在传递Sendable对象时,使用拷贝数据的方式。

元服务API:从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
message Object 是 发送至Worker的数据,该数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。
options PostMessageOptions 否

当填入该参数时,传输的数据将通过所有权转移的方式发送到Worker线程。这些数据在宿主线程中将变为不可用,仅在Worker线程中可用。

若不填入该参数,默认设置为 undefined,数据将通过拷贝的方式传输到Worker线程。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200006 An exception occurred during serialization.

示例:

收起
自动换行
深色代码主题
复制
  1. import { worker } from '@kit.ArkTS';
  2. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  3. workerInstance.postMessage("hello world");
  4. let buffer = new ArrayBuffer(8);
  5. // 填入options参数,buffer的所有权会转移到Worker线程,在宿主线程中将不可用
  6. workerInstance.postMessage(buffer, {transfer: [buffer]});

postMessageWithSharedSendable12+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessageWithSharedSendable(message: Object, transfer?: ArrayBuffer[]): void

宿主线程向Worker线程发送消息,消息中的Sendable对象通过引用传递,非Sendable对象通过拷贝数据的方式传递。

元服务API:从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
message Object 是 发送至Worker的数据,该数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。如果需要共享数据,支持类型见Sendable支持的数据类型。
transfer ArrayBuffer[] 否 可转移的ArrayBuffer实例对象数组。该数组中对象的所有权将转移到Worker线程,在宿主线程中变为不可用,仅在Worker线程中可用,数组不可传入null。默认值为undefined。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200006 An exception occurred during serialization.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. // 新建SendableObject实例并通过宿主线程传递至Worker线程
  3. import { worker } from '@kit.ArkTS';
  4. import { SendableObject } from './sendable';
  5. const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
  6. let object: SendableObject = new SendableObject();
  7. workerInstance.postMessageWithSharedSendable(object);
  8. // 使用postMessage接口传递Sendable对象,使用拷贝数据的方式传递
  9. workerInstance.postMessage(object);
收起
自动换行
深色代码主题
复制
  1. // sendable.ets
  2. // 定义SendableObject
  3. @Sendable
  4. export class SendableObject {
  5. value:number = 45;
  6. }
收起
自动换行
深色代码主题
复制
  1. // worker文件路径为:entry/src/main/ets/workers/Worker.ets
  2. // Worker.ets
  3. // 接收宿主线程传递至Worker线程的数据并访问
  4. import { SendableObject } from '../pages/sendable';
  5. import { worker, ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@kit.ArkTS';
  6. const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  7. workerPort.onmessage = (e: MessageEvents) => {
  8. let obj: SendableObject = e.data;
  9. console.info("sendable obj is: " + obj.value);
  10. }

on9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

on(type: string, listener: WorkerEventListener): void

向宿主线程的Worker实例对象添加一个事件监听,该接口与addEventListener9+接口功能一致。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 监听的事件类型。
listener WorkerEventListener 是 回调的事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200005 The called API is not supported in the worker thread.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.on("alert", () => {
  5. console.info("alert listener callback");
  6. })
  7. // 使用on添加的事件监听可以多次执行
  8. workerInstance.dispatchEvent({type: "alert", timeStamp: 0}); // timeStamp暂未支持
  9. workerInstance.dispatchEvent({type: "alert", timeStamp: 0}); // timeStamp暂未支持

once9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

once(type: string, listener: WorkerEventListener): void

向宿主线程的Worker实例对象添加一个事件监听,该事件监听只执行一次,执行完后会自动删除。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 监听的事件类型。
listener WorkerEventListener 是 回调的事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200005 The called API is not supported in the worker thread.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.once("alert", () => {
  5. console.info("alert listener callback");
  6. })
  7. workerInstance.dispatchEvent({type: "alert", timeStamp: 0}); // timeStamp暂未支持

off9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

off(type: string, listener?: WorkerEventListener): void

移除宿主线程的Worker实例对象中类型为type的事件监听,该接口与removeEventListener9+接口功能一致。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 需要删除的事件类型。事件类型通过on9+设置。
listener WorkerEventListener 否 需要删除的特定监听器回调函数。如果未传入此参数,则会删除该类型的所有监听器。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200005 The called API is not supported in the worker thread.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. const handler1 = () => console.info("Handler 1");
  5. const handler2 = () => console.info("Handler 2");
  6. // 注册两个监听器
  7. workerInstance.on("alert", handler1);
  8. workerInstance.on("alert", handler2);
  9. // 首次触发:两个监听器都会执行
  10. workerInstance.dispatchEvent({type: "alert", timeStamp: 0}); // timeStamp暂未支持
  11. // 删除 handler1 监听器
  12. workerInstance.off("alert", handler1);
  13. // 再次触发:只剩 handler2 会执行
  14. workerInstance.dispatchEvent({type: "alert", timeStamp: 0}); // timeStamp暂未支持
  15. // 删除"alert"类型所有监听器
  16. workerInstance.off("alert");

registerGlobalCallObject11+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

registerGlobalCallObject(instanceName: string, globalCallObject: Object): void

在宿主线程的ThreadWorker实例上注册一个对象,该对象的方法可在Worker线程中调用。详情请参见callGlobalCallObjectMethod。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
instanceName string 是 注册对象时使用的键,调用时通过该键值找到被注册的对象。
globalCallObject Object 是 被注册的对象,ThreadWorker实例会持有被注册对象的强引用。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. class TestObj {
  5. private message : string = "this is a message from TestObj";
  6. public getMessage() : string {
  7. return this.message;
  8. }
  9. public getMessageWithInput(str : string) : string {
  10. return this.message + " with input: " + str;
  11. }
  12. }
  13. let registerObj = new TestObj();
  14. // 在ThreadWorker实例上注册registerObj
  15. workerInstance.registerGlobalCallObject("myObj", registerObj);
  16. workerInstance.postMessage("start worker");
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { worker, MessageEvents } from '@kit.ArkTS';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = (e: MessageEvents): void => {
  5. try {
  6. // 调用方法无入参
  7. let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessage", 0) as string;
  8. console.info("worker:", res) // worker: this is a message from TestObj
  9. } catch (error) {
  10. // 异常处理
  11. console.error("worker: error code is " + error.code + " error message is " + error.message);
  12. }
  13. try {
  14. // 调用方法有入参
  15. let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessageWithInput", 0, "hello there!") as string;
  16. console.info("worker:", res); // worker: this is a message from TestObj with input: hello there!
  17. } catch (error) {
  18. // 异常处理
  19. console.error("worker: error code is " + error.code + " error message is " + error.message);
  20. }
  21. }

unregisterGlobalCallObject11+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

unregisterGlobalCallObject(instanceName?: string): void

取消在宿主线程ThreadWorker实例上注册的对象,该方法会释放ThreadWorker实例中与该键相匹配的对象的强引用。如果无匹配对象,该方法不会报错。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
instanceName string 否 注册对象时使用的键。此参数不填时,会释放ThreadWorker实例中所有已注册的对象。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. class TestObj {
  5. private message : string = "this is a message from TestObj";
  6. public getMessage() : string {
  7. return this.message;
  8. }
  9. public getMessageWithInput(str : string) : string {
  10. return this.message + " with input: " + str;
  11. }
  12. }
  13. let registerObj = new TestObj();
  14. workerInstance.registerGlobalCallObject("myObj", registerObj);
  15. // 取消对象注册
  16. workerInstance.unregisterGlobalCallObject("myObj");
  17. // 取消ThreadWorker实例上的所有对象注册
  18. workerInstance.postMessage("start worker");

terminate9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

terminate(): void

由宿主线程主动销毁Worker线程并停止Worker线程接收消息。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.terminate();

addEventListener9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

addEventListener(type: string, listener: WorkerEventListener): void

向宿主线程的Worker实例对象添加一个事件监听,该接口与on9+接口功能一致。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 监听的事件类型。
listener WorkerEventListener 是 回调的事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200005 The called API is not supported in the worker thread.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.addEventListener("alert", () => {
  5. console.info("alert listener callback");
  6. })
  7. // 执行 alert 事件类型的回调
  8. workerInstance.dispatchEvent({type: "alert", timeStamp: 0}); // timeStamp暂未支持

removeEventListener9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

removeEventListener(type: string, callback?: WorkerEventListener): void

移除宿主线程的Worker实例对象中类型为type的事件监听,该接口与off9+接口功能一致。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 需要删除的监听事件类型。事件类型通过addEventListener9+设置。
callback WorkerEventListener 否 需要删除的特定监听器回调函数。如果未传入此参数,则会删除该类型的所有监听器。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.addEventListener("alert", () => {
  5. console.info("alert listener callback");
  6. })
  7. workerInstance.dispatchEvent({type: "alert", timeStamp: 0}); // timeStamp暂未支持
  8. workerInstance.removeEventListener("alert");

dispatchEvent9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

dispatchEvent(event: Event): boolean

在宿主线程将事件对象分发到Worker线程的事件系统,该系统会自动触发该类型事件对应的所有监听器回调。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
event Event 是 需要分发的事件。

返回值:

展开
类型 说明
boolean 分发的结果。true表示分发成功,false表示分发失败。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.addEventListener("alert", () => {
  5. console.info("alert listener callback");
  6. })
  7. let result: boolean = workerInstance.dispatchEvent({type: "alert", timeStamp: 0}); // timeStamp暂未支持
  8. console.info("dispatchEvent result is: ", result);

分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,完整示例请参考分发事件与监听接口搭配使用示例。

removeAllListener9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

removeAllListener(): void

移除宿主线程中Worker实例对象的所有事件监听。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.addEventListener("alert", () => {
  5. console.info("alert listener callback");
  6. })
  7. workerInstance.removeAllListener();

WorkerEventTarget9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

用于管理Worker的监听事件。

addEventListener9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

addEventListener(type: string, listener: WorkerEventListener): void

向Worker线程的实例对象添加事件监听。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 监听的事件类型。
listener WorkerEventListener 是 回调的事件。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200005 The called API is not supported in the worker thread.

示例:

收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
  3. const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  4. workerPort.onmessage = (event: MessageEvents) => {
  5. workerPort.addEventListener("alert", () => {
  6. console.info("alert listener callback");
  7. })
  8. };

removeEventListener9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

removeEventListener(type: string, callback?: WorkerEventListener): void

移除Worker线程实例对象中类型为type的事件监听。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 需要删除的监听事件类型。事件类型通过addEventListener9+设置。
callback WorkerEventListener 否 需要删除的特定监听器回调函数。如果未传入此参数,则会删除该类型的所有监听器。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
  3. const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  4. workerPort.onmessage = (event: MessageEvents) => {
  5. workerPort.addEventListener("alert", () => {
  6. console.info("alert listener callback");
  7. });
  8. workerPort.removeEventListener("alert");
  9. };

dispatchEvent9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

dispatchEvent(event: Event): boolean

在Worker线程将事件对象分发到Worker线程的事件系统,并触发该类型事件的所有监听器回调。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
event Event 是 需要分发的事件。

返回值:

展开
类型 说明
boolean 分发的结果。true表示分发成功,false表示分发失败。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
  3. const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  4. workerPort.onmessage = (event: MessageEvents) => {
  5. workerPort.addEventListener("alert", () => {
  6. console.info("alert listener callback");
  7. });
  8. workerPort.dispatchEvent({type: "alert", timeStamp: 0}); // timeStamp暂未支持
  9. };

分发事件(dispatchEvent)可与监听接口(addEventListener)搭配使用,完整示例请参考分发事件与监听接口搭配使用示例。

removeAllListener9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

removeAllListener(): void

移除Worker线程的实例对象所有的事件监听。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
  3. const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  4. workerPort.onmessage = (event: MessageEvents) => {
  5. workerPort.addEventListener("alert", () => {
  6. console.info("alert listener callback");
  7. });
  8. workerPort.removeAllListener();
  9. };

ThreadWorkerGlobalScope9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

Worker线程用于与宿主线程通信的类。ThreadWorkerGlobalScope类继承GlobalScope。

属性

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
onmessage9+ (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void 否 是

回调函数。表示Worker线程收到来自其宿主线程通过postMessage或postMessageWithSharedSendable接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。其中this指调用者对象本身ThreadWorkerGlobalScope,ev类型为MessageEvents,表示收到的宿主线程发送的消息数据。默认值为undefined。

元服务API:从API version 11开始,该属性支持在元服务中使用。

onmessageerror9+ (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void 否 是

回调函数。表示当Worker线程的Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。其中this指调用者对象本身ThreadWorkerGlobalScope,ev类型为MessageEvents,表示收到的消息数据。默认值为undefined。

元服务API:从API version 11开始,该属性支持在元服务中使用。

postMessage9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessage(messageObject: Object, transfer: ArrayBuffer[]): void;

Worker线程通过转移对象所有权的方式向宿主线程发送消息。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
messageObject Object 是 发送至宿主线程的数据,该数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。
transfer ArrayBuffer[] 是 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200006 An exception occurred during serialization.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker, MessageEvents } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = (e: MessageEvents): void => {
  6. console.info("receive data from worker.ets");
  7. }
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { worker, MessageEvents } from '@kit.ArkTS';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = (e: MessageEvents): void => {
  5. let buffer = new ArrayBuffer(8);
  6. workerPort.postMessage(buffer, [buffer]);
  7. }

postMessage9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessage(messageObject: Object, options?: PostMessageOptions): void

Worker线程通过转移对象所有权或拷贝数据的方式向宿主线程发送消息。在传递Sendable对象时,使用拷贝数据的方式进行传递。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
messageObject Object 是 发送至宿主线程的数据,该数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。
options PostMessageOptions 否

当填入该参数时,其作用与传入ArrayBuffer[]相同,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将变为不可用,仅在宿主线程中可用。

若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到宿主线程。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200006 An exception occurred during serialization.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker, MessageEvents } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = (e: MessageEvents): void => {
  6. console.info("receive data from worker.ets");
  7. }
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { worker, MessageEvents } from '@kit.ArkTS';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = (e: MessageEvents): void => {
  5. workerPort.postMessage("receive data from main thread");
  6. }

postMessageWithSharedSendable12+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessageWithSharedSendable(message: Object, transfer?: ArrayBuffer[]): void

Worker线程向宿主线程发送消息,消息中的Sendable对象通过引用传递,非Sendable对象通过拷贝数据的方式传递。

元服务API:从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
message Object 是 发送至宿主线程的数据,该数据对象必须是可序列化或可共享,序列化支持类型见序列化支持类型,共享支持类型见Sendable支持的数据类型。
transfer ArrayBuffer[] 否 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。默认值为空数组。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200006 An exception occurred during serialization.

示例:

收起
自动换行
深色代码主题
复制
  1. // worker文件路径为:entry/src/main/ets/workers/Worker.ets
  2. // Worker.ets
  3. // 新建SendableObject实例并通过Worker线程传递至宿主线程
  4. import { SendableObject } from '../pages/sendable';
  5. import { worker, ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@kit.ArkTS';
  6. const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  7. workerPort.onmessage = (e: MessageEvents) => {
  8. let object: SendableObject = new SendableObject();
  9. workerPort.postMessageWithSharedSendable(object);
  10. }
收起
自动换行
深色代码主题
复制
  1. // sendable.ets
  2. // 定义SendableObject
  3. @Sendable
  4. export class SendableObject {
  5. a:number = 45;
  6. }
收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. // 接收Worker线程传递至宿主线程的数据并访问其属性
  3. import { worker, MessageEvents } from '@kit.ArkTS';
  4. import { SendableObject } from './sendable';
  5. const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
  6. workerInstance.postMessage(1);
  7. workerInstance.onmessage = (e: MessageEvents) => {
  8. let obj: SendableObject = e.data;
  9. console.info("sendable index obj is: " + obj.a);
  10. }

callGlobalCallObjectMethod11+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

callGlobalCallObjectMethod(instanceName: string, methodName: string, timeout: number, ...args: Object[]): Object

Worker线程调用宿主线程上注册的对象的指定方法,此调用对Worker线程同步,对宿主线程异步,返回值通过数据拷贝传递。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
instanceName string 是 注册对象时使用的键,用于在宿主线程中查找对象。
methodName string 是 在已注册对象上调用的方法名。该方法不能使用async修饰,也不能基于底层异步机制返回结果,否则会抛出异常。
timeout number 是

表示从Worker线程发起调用开始到在主线程中执行目标方法的最大等待时间,单位为ms,取整数,取值范围为[1-5000]ms。超出范围的,则表示本次调用等待时间为5000ms。

API version 21 之前,在debug模式下受此参数设置的最大等待时间限制。

从API version 21 开始,在debug模式下不受此参数设置的最大等待时间限制,可一直等待。

args Object[] 否 注册对象上所调用方法的参数数组。

返回值:

展开
类型 说明
Object 返回值为调用方法在宿主线程的返回值,该返回值必须是可序列化的,具体可见序列化支持类型。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200006 An exception occurred during serialization.
10200019 The globalCallObject is not registered.
10200020 The method to be called is not callable or is an async method or a generator.
10200021 The global call exceeds the timeout.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. class TestObj {
  5. private message : string = "this is a message from TestObj";
  6. public getMessage() : string {
  7. return this.message;
  8. }
  9. public getMessageWithInput(str : string) : string {
  10. return this.message + " with input: " + str;
  11. }
  12. }
  13. let registerObj = new TestObj();
  14. // 在ThreadWorker实例上注册registerObj
  15. workerInstance.registerGlobalCallObject("myObj", registerObj);
  16. workerInstance.postMessage("start worker");
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { worker, MessageEvents } from '@kit.ArkTS';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = (e: MessageEvents): void => {
  5. try {
  6. // 调用方法无入参
  7. let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessage", 0) as string;
  8. console.info("worker:", res); // worker: this is a message from TestObj
  9. } catch (error) {
  10. // 异常处理
  11. console.error("worker: error code is " + error.code + " error message is " + error.message);
  12. }
  13. try {
  14. // 调用方法有入参
  15. let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessageWithInput", 0, "hello there!") as string;
  16. console.info("worker:", res); // worker: this is a message from TestObj with input: hello there!
  17. } catch (error) {
  18. // 异常处理
  19. console.error("worker: error code is " + error.code + " error message is " + error.message);
  20. }
  21. }

close9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

close(): void

销毁Worker线程,终止Worker接收消息。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.postMessage("hello world");
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { worker, MessageEvents } from '@kit.ArkTS';
  3. const workerPort = worker.workerPort;
  4. workerPort.onmessage = (e: MessageEvents): void => {
  5. workerPort.close();
  6. }

postMessageAtFront

Phone26.0.0+PC/2in126.0.0+Tablet26.0.0+TV26.0.0+Wearable26.0.0+

postMessageAtFront?(message: Object, priority: Priority, transfer?: ArrayBuffer[]): void

Worker线程向宿主线程发送插队消息,消息中的Sendable对象通过引用传递,非Sendable对象通过拷贝数据的方式传递。

说明
  • 如果是Worker线程向宿主线程发送插队的消息,消息能够插队并且按优先级进行发送。
  • 如果是Worker线程之间发送插队的消息,消息只能插队,没有优先级。
  • postMessage和postMessageWithSharedSendable接口向宿主线程发送消息,默认是HIGH优先级,无插队效果。

起始版本:26.0.0

模型约束:此接口仅可在Stage模型下使用。

元服务API:从API版本26.0.0开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
message Object 是 发送至宿主线程的数据,该数据对象必须是可序列化或可共享,序列化支持类型见序列化支持类型,共享支持类型见Sendable支持的数据类型。
priority Priority 是 消息发送的优先级。
transfer ArrayBuffer[] 否 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。默认值为空数组。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200006 An exception occurred during serialization.

示例:

收起
自动换行
深色代码主题
复制
  1. // worker文件路径为:entry/src/main/ets/workers/Worker.ets
  2. // Worker.ets
  3. import { MessageEvents, ThreadWorkerGlobalScope, worker, Priority } from '@kit.ArkTS';
  4. const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  5. workerPort.onmessage = (e: MessageEvents) => {
  6. workerPort.postMessage("1");
  7. workerPort.postMessage("2");
  8. // 方式1:使用可选链操作符(推荐,最简洁)
  9. workerPort.postMessageAtFront?.("3-idle", Priority.IDLE);
  10. workerPort.postMessageAtFront?.("4-immediate", Priority.IMMEDIATE);
  11. // 方式2:使用非空断言,直接调用(需要确定它一定存在)
  12. workerPort.postMessageAtFront!("5-low", Priority.LOW);
  13. // 方式3:判断方法存在后再使用
  14. if (workerPort.postMessageAtFront) {
  15. workerPort.postMessageAtFront("6-high", Priority.HIGH);
  16. } else {
  17. workerPort.postMessageWithSharedSendable("6-high");
  18. }
  19. }
收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. // 接收Worker线程传递至宿主线程的数据
  3. import { worker, MessageEvents } from '@kit.ArkTS';
  4. const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
  5. workerInstance.postMessage("start");
  6. workerInstance.onmessage = (e: MessageEvents) => {
  7. // 模拟耗时操作
  8. let start = new Date().getTime();
  9. while (new Date().getTime() - start < 1000) {
  10. continue;
  11. }
  12. let res: string = e.data as string;
  13. // 执行效果:
  14. // result is: 1
  15. // result is: 4-immediate
  16. // result is: 6-high
  17. // result is: 2
  18. // result is: 5-low
  19. // result is: 3-idle
  20. console.info("result is: " + res);
  21. }

如果传递的参数是对象字面量的话,需要显式标注对象字面量的类型。

收起
自动换行
深色代码主题
复制
  1. import { worker, ThreadWorkerGlobalScope, MessageEvents, ErrorEvent, Priority } from '@kit.ArkTS';
  2. class ClassA {
  3. public obj: string = ""
  4. }
  5. const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  6. workerPort.onmessage = (e: MessageEvents) => {
  7. // 使用可选链操作符调用接口,传递字面量对象时会编译报错,需要显式标注对象字面量的类型。
  8. // workerPort.postMessageAtFront?.({obj: "obj"}, Priority.HIGH);
  9. let classAInstance: ClassA = { obj: "obj" };
  10. workerPort.postMessageAtFront?.(classAInstance, Priority.HIGH);
  11. // 使用非空断言,直接调用。可以直接传递对象字面量。
  12. workerPort.postMessageAtFront!({ obj: "obj" }, Priority.HIGH);
  13. // 判断方法存在后再使用。可以直接传递对象字面量。
  14. if (workerPort.postMessageAtFront) {
  15. workerPort.postMessageAtFront({ obj: "obj" }, Priority.HIGH);
  16. } else {
  17. workerPort.postMessageWithSharedSendable({ obj: "obj" });
  18. }
  19. }

WorkerEventListener9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

事件监听类。

(event: Event)9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

(event: Event): void | Promise<void>

指定要调用的回调函数。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
event Event 是 回调的事件类。

返回值:

展开
类型 说明
void | Promise<void> 无返回值或者以Promise形式返回。

错误码:

以下错误码的详细介绍请参见语言基础类库错误码。

展开
错误码ID 错误信息
10200004 The Worker instance is not running.
10200005 The called API is not supported in the worker thread.

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker, Event } from "@kit.ArkTS"
  3. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  4. workerInstance.addEventListener("alert", (event: Event) => {
  5. console.info("event type is: ", JSON.stringify(event.type));
  6. });
  7. const eventToDispatch : Event = { type: "alert", timeStamp: 0 }; // timeStamp暂未支持
  8. workerInstance.dispatchEvent(eventToDispatch);

GlobalScope9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

Worker线程自身的运行环境,GlobalScope类继承WorkerEventTarget。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
name string 是 否 Worker的名字,new Worker时指定。
self GlobalScope & typeof globalThis 是 否 GlobalScope本身。
onerror (ev: ErrorEvent) => void 否 是 Worker在执行过程中发生异常被调用的回调函数,在Worker线程中执行,ev表示收到的异常数据。默认值为undefined。

MessageEvents9+

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

消息类,持有Worker线程间传递的数据,MessageEvents类继承Event。

元服务API: 从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
data any 是 否 线程间传递的数据。

MessageType

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

type MessageType = 'message' | 'messageerror'

表示消息类型。预留数据类型,暂未实现。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

展开
类型 说明
'message' 表示消息类型为message,值固定为'message'字符串。
'messageerror' 表示消息类型为messageerror,值固定为'messageerror'字符串。

ErrorCallback18+

Phone18+PC/2in118+Tablet18+TV19+Wearable18+

type ErrorCallback = (err: ErrorEvent) => void

表示异常回调类型。

元服务API: 从API version 18开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
err ErrorEvent 是 错误事件类,表示Worker执行过程中出现的异常信息。

Worker(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

使用以下方法前,均需先构造Worker实例,Worker类继承EventTarget。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker替代。

属性

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
onexit(deprecated) (code: number) => void 否 是

回调函数。表示Worker销毁时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中code类型为number,异常退出为1,正常退出为0。默认值为undefined。

说明:从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.onexit替代。

onerror(deprecated) (err: ErrorEvent) => void 否 是

回调函数。表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中err类型为ErrorEvent,表示收到的异常数据。默认值为undefined。

说明:从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.onerror替代。

onmessage(deprecated) (event: MessageEvent) => void 否 是

回调函数。表示宿主线程接收到来自其创建的Worker通过workerPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中event类型为MessageEvent,表示收到的Worker消息数据。默认值为undefined。

说明:从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.onmessage替代。

onmessageerror(deprecated) (event: MessageEvent) => void 否 是

回调函数。表示当Worker对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中event类型为MessageEvent,表示收到的Worker消息数据。默认值为undefined。

说明:从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.onmessageerror替代。

constructor(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

constructor(scriptURL: string, options?: WorkerOptions)

Worker构造函数。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.constructor9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
scriptURL string 是 Worker线程文件的路径,详细参考文件路径注意事项。
options WorkerOptions 否 Worker构造的选项。

示例:

此处以在Stage模型的entry模块Index.ets文件中加载Worker线程文件为例,使用Library加载Worker线程文件的场景参考文件路径注意事项。

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. // worker文件所在路径:"entry/src/main/ets/workers/worker.ets"
  4. const workerInstance = new worker.Worker('entry/ets/workers/worker.ets', {name: "WorkerThread"});

postMessage(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessage(message: Object, transfer: ArrayBuffer[]): void

宿主线程通过转移对象所有权的方式向Worker线程发送消息。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.postMessage9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
message Object 是 发送至Worker的数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。
transfer ArrayBuffer[] 是 表示可转移的ArrayBuffer实例对象数组,所有权会转移到Worker线程,仅在该线程中可用。数组不可传入null。

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. let buffer = new ArrayBuffer(8);
  5. workerInstance.postMessage(buffer, [buffer]);

postMessage(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessage(message: Object, options?: PostMessageOptions): void

宿主线程通过转移对象所有权或者拷贝数据的方式向Worker线程发送消息。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.postMessage9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
message Object 是 发送至Worker的数据,该数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。
options PostMessageOptions 否

当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将变为不可用,仅在Worker线程中可用。

若不填入该参数,默认设置为undefined,通过拷贝数据的方式传输信息到Worker线程。

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. workerInstance.postMessage("hello world");
  5. let buffer = new ArrayBuffer(8);
  6. workerInstance.postMessage(buffer, [buffer]);

on(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

on(type: string, listener: EventListener): void

向Worker添加一个事件监听,该接口与addEventListener(deprecated)接口功能一致。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.on9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 监听的事件类型。
listener EventListener 是 事件触发时的回调函数。

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. workerInstance.on("alert", () => {
  5. console.info("alert listener callback");
  6. })

once(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

once(type: string, listener: EventListener): void

向Worker添加一个事件监听,该事件监听只执行一次,执行完后会自动删除。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.once9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 监听的事件类型。
listener EventListener 是 事件触发时的回调函数。

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. workerInstance.once("alert", () => {
  5. console.info("alert listener callback");
  6. })

off(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

off(type: string, listener?: EventListener): void

移除类型为type的事件监听,该接口与removeEventListener(deprecated)接口功能一致。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.off9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 需要删除的事件类型。事件类型通过on(deprecated)设置。
listener EventListener 否 需要删除的特定监听器回调函数。如果未传入此参数,则会删除该类型的所有监听器。

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. // 使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
  5. workerInstance.off("alert");

terminate(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

terminate(): void

销毁Worker线程,终止Worker接收消息。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorker.terminate9+替代。

系统能力: SystemCapability.Utils.Lang

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. workerInstance.terminate();

EventTarget(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+
说明

从API version 7开始支持,从API version 9开始废弃,建议使用WorkerEventTarget9+替代。

addEventListener(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

addEventListener(type: string, listener: EventListener): void

向Worker添加一个事件监听,该接口与on(deprecated)接口功能一致。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用addEventListener9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 监听的事件类型。
listener EventListener 是 事件触发时的回调函数。

示例:

收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
  3. const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
  4. workerPort.addEventListener("alert", () => {
  5. console.info("alert listener callback");
  6. })

removeEventListener(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

removeEventListener(type: string, callback?: EventListener): void

移除Worker的事件监听,该接口与off(deprecated)接口功能一致。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用removeEventListener9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
type string 是 需要移除的事件类型。事件类型通过addEventListener(deprecated)设置。
callback EventListener 否 需要删除的特定监听器回调函数。如果未传入此参数,则会删除该类型的所有监听器。

示例:

收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
  3. const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
  4. workerPort.addEventListener("alert", () => {
  5. console.info("alert listener callback");
  6. })
  7. workerPort.removeEventListener('alert');

dispatchEvent(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

dispatchEvent(event: Event): boolean

分发Worker实例上已注册的事件。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用dispatchEvent9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
event Event 是 需要分发的事件。

返回值:

展开
类型 说明
boolean 分发的结果。true表示分发成功,false表示分发失败。

示例:

收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
  3. const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
  4. workerPort.addEventListener("alert_add", ()=>{
  5. console.info("alert listener callback");
  6. })
  7. workerPort.dispatchEvent({type: 'alert_add', timeStamp: 0}); // timeStamp暂未支持

分发事件(dispatchEvent)可与监听接口(addEventListener)搭配使用,示例如下:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = (): void => {
  6. console.info("receive data from worker.ets");
  7. }
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
  3. const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
  4. workerPort.addEventListener("alert", ()=>{
  5. console.info("alert listener callback");
  6. })
  7. workerPort.onmessage = (event: MessageEvents) => {
  8. workerPort.dispatchEvent({type:"alert", timeStamp:0}); // timeStamp暂未支持
  9. }

removeAllListener(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

removeAllListener(): void

移除Worker所有的事件监听。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用removeAllListener9+替代。

系统能力: SystemCapability.Utils.Lang

示例:

收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
  3. const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
  4. workerPort.addEventListener("alert_add", ()=>{
  5. console.info("alert listener callback");
  6. })
  7. workerPort.removeAllListener();

DedicatedWorkerGlobalScope(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

Worker线程用于与宿主线程通信的类。DedicatedWorkerGlobalScope类继承WorkerGlobalScope。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorkerGlobalScope9+替代。

属性

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
onmessage(deprecated) (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void 否 是

回调函数,表示Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。其中this指调用者对象本身DedicatedWorkerGlobalScope,ev类型为MessageEvent,表示收到的Worker消息数据。默认值为undefined。

说明:从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorkerGlobalScope.onmessage替代。

onmessageerror(deprecated) (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void 否 是

回调函数,表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。其中this指调用者对象本身DedicatedWorkerGlobalScope,ev类型为MessageEvent,表示收到的Worker消息数据。默认值为undefined。

说明:从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorkerGlobalScope.onmessageerror替代。

postMessage(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessage(messageObject: Object, transfer: Transferable[]): void

Worker线程通过转移对象所有权的方式向宿主线程发送消息。

说明

此接口暂不支持使用,从API version 9开始废弃,建议使用ThreadWorkerGlobalScope9+.postMessage9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
messageObject Object 是 发送至宿主线程的数据,该数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。
transfer Transferable[] 是 暂不支持该参数类型。

postMessage(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessage(messageObject: Object, transfer: ArrayBuffer[]): void

Worker线程通过转移对象所有权的方式向宿主线程发送消息。

说明

postMessage接口从API version 9开始支持,从API version 9开始废弃,建议使用ThreadWorkerGlobalScope9+.postMessage9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
messageObject Object 是 发送至宿主线程的数据,该数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。
transfer ArrayBuffer[] 是 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = (e: MessageEvents): void => {
  6. // let data = e.data;
  7. console.info("receive data from worker.ets");
  8. }
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { DedicatedWorkerGlobalScope, worker } from '@kit.ArkTS';
  3. const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
  4. workerPort.onmessage = (): void => {
  5. // let data = e.data;
  6. let buffer = new ArrayBuffer(5)
  7. workerPort.postMessage(buffer, [buffer]);
  8. }

postMessage(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

postMessage(messageObject: Object, options?: PostMessageOptions): void

Worker线程通过转移对象所有权或者拷贝数据的方式向宿主线程发送消息。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorkerGlobalScope9+.postMessage9+替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
messageObject Object 是 发送至宿主线程的数据,该数据对象必须是可序列化对象,序列化支持类型见序列化支持类型。
options PostMessageOptions 否

当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用。

若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到宿主线程。

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. workerInstance.postMessage("hello world");
  5. workerInstance.onmessage = (): void => {
  6. console.info("receive data from worker.ets");
  7. }
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessage = (e: MessageEvents) => {
  5. parentPort.postMessage("receive data from main thread");
  6. }

close(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

close(): void

销毁Worker线程,终止Worker接收消息。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用ThreadWorkerGlobalScope9+.close9+替代。

系统能力: SystemCapability.Utils.Lang

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. workerInstance.postMessage("hello world");
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { worker } from '@kit.ArkTS';
  3. const parentPort = worker.parentPort;
  4. parentPort.onmessage = (): void => {
  5. parentPort.close()
  6. }

PostMessageOptions

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

明确数据传递过程中需要转移所有权的对象,这些对象必须是ArrayBuffer,在发送方的上下文中将变为不可用,仅在接收方可用。

元服务API:从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
transfer Object[] 否 是 ArrayBuffer数组,用于传递所有权。该数组中不可传入null。默认值为undefined。

Event

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

事件类。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
type string 是 否 指定事件的类型。
timeStamp number 是 否 事件创建时的时间戳,单位为ms,目前不支持。

EventListener(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

事件监听类用于处理事件。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用WorkerEventListener9+替代。

(evt: Event)(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

(evt: Event): void | Promise<void>

说明

从API version 7开始支持,从API version 9开始废弃,建议使用(event: Event)替代。

系统能力: SystemCapability.Utils.Lang

参数:

展开
参数名 类型 必填 说明
evt Event 是 回调的事件类。

返回值:

展开
类型 说明
void | Promise<void> 无返回值或者以Promise形式返回。

示例:

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker } from '@kit.ArkTS';
  3. const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
  4. workerInstance.addEventListener("alert", ()=>{
  5. console.info("alert listener callback");
  6. })

ErrorEvent

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

错误事件类用于表示Worker执行过程中出现异常的详细信息,该类继承Event。

元服务API:从API version 11开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
message string 是 否 异常发生的错误信息。
filename string 是 否 出现异常所在的文件。
lineno number 是 否 异常所在的行数。
colno number 是 否 异常所在的列数。
error Object 是 否 异常对象。

MessageEvent<T>

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

消息类,持有Worker线程间传递的数据,MessageEvent类继承Event。

元服务API: 从API version 12开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
data T 是 否 线程间传递的数据。

WorkerGlobalScope(deprecated)

Phone12+PC/2in113+Tablet12+TV19+Wearable18+

Worker线程自身的运行环境,WorkerGlobalScope类继承EventTarget。

说明

从API version 7开始支持,从API version 9开始废弃,建议使用GlobalScope9+替代。

系统能力: SystemCapability.Utils.Lang

展开
名称 类型 只读 可选 说明
name string 是 否 Worker的名字,new Worker时指定。
self WorkerGlobalScope & typeof globalThis 是 否 WorkerGlobalScope本身。
onerror (ev: ErrorEvent) => void 否 是 Worker在执行过程中发生异常被调用的回调函数,在Worker线程中执行,ev表示收到的异常数据,默认值为undefined。

Priority

Phone26.0.0+PC/2in126.0.0+Tablet26.0.0+TV26.0.0+Wearable26.0.0+

表示发送消息时的优先级。

起始版本:26.0.0

模型约束:此接口仅可在Stage模型下使用。

元服务API:从API版本26.0.0开始,该接口支持在元服务中使用。

系统能力: SystemCapability.Utils.Lang

展开
名称 值 说明
IMMEDIATE 1 立即执行优先级。表示消息优先于HIGH优先级发送。
HIGH 2 高优先级。表示消息优先于LOW优先级发送。
LOW 3 低优先级。表示消息优先于IDLE优先级发送。
IDLE 4 后台优先级。表示在没有其他优先级消息的情况下,才发送该消息。

其他说明

序列化支持类型

序列化支持类型包括:除Symbol之外的基础类型、Date、String、RegExp、Array、Map、Set、Object(仅限简单对象,比如通过"{}"或者"new Object"创建,普通对象仅支持传递属性,不支持传递其原型及方法)、ArrayBuffer、TypedArray。

特例:传递通过自定义class创建出来的object时,不会发生序列化错误,但是自定义class的属性(如Function)无法通过序列化传递。

说明

以API version 9的FA工程为例。

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker, MessageEvents } from '@kit.ArkTS';
  3. const workerInstance = new worker.ThreadWorker("workers/worker.ets");
  4. workerInstance.postMessage("message from main thread to worker");
  5. workerInstance.onmessage = (d: MessageEvents): void => {
  6. // 当Worker线程传递myModel时,data即为myModel。data没有init的方法
  7. let data: Record<string, Object> = d.data as Record<string, Object>;
  8. console.info('name:', data.name);// name: default name
  9. console.info('init:', data.init === undefined);// init: true
  10. }
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
  3. const workerPort = worker.workerPort;
  4. class MyModel {
  5. name = "default name";
  6. init() {
  7. this.name = "MyModel";
  8. }
  9. }
  10. workerPort.onmessage = (d: MessageEvents): void => {
  11. console.info("worker.ets onmessage");
  12. let data: string = d.data;
  13. let func1 = () => {
  14. console.info("post message is function");
  15. }
  16. // workerPort.postMessage(func1); 传递func1发生序列化错误
  17. let myModel = new MyModel();
  18. workerPort.postMessage(myModel); // 传递myModel不会发生序列化错误,myModel中的函数会丢失
  19. }
  20. workerPort.onmessageerror = () => {
  21. console.error("worker.ets onmessageerror");
  22. }
  23. workerPort.onerror = (err: ErrorEvent) => {
  24. console.error("worker.ets onerror" + err.message);
  25. }

内存模型

Worker基于Actor并发模型实现。在Worker的交互流程中,宿主线程可以创建多个Worker子线程,各个Worker线程间运行环境相互隔离,并通过序列化、引用传递或转移所有权的方式传递对象,等到Worker线程完成计算任务,再把结果返回给宿主线程。

Actor并发模型的交互原理:各个Actor并发地处理宿主线程任务,每个Actor内部都有一个消息队列和单线程执行模块。消息队列负责接收宿主线程及其他Actor的请求,而单线程执行模块则负责串行地处理这些请求、向其他Actor发送请求以及创建新的Actor。由于Actor采用的是异步方式,各个Actor之间相互隔离且没有数据竞争,因此Actor可以高并发运行。

完整示例

说明

API version 8及之前的版本仅支持FA模型,如需使用,注意更换构造Worker的接口和创建Worker线程中与宿主线程通信的对象的两个方法。

FA模型

此处以API version 9的工程为例。

收起
自动换行
深色代码主题
复制
  1. // main thread(同级目录为例)
  2. import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
  3. // 宿主线程中创建Worker对象
  4. const workerInstance = new worker.ThreadWorker("workers/worker.ets");
  5. // 宿主线程向worker线程传递信息
  6. const buffer = new ArrayBuffer(8);
  7. workerInstance.postMessage(buffer, [buffer]);
  8. // 宿主线程接收worker线程信息
  9. workerInstance.onmessage = (e: MessageEvents): void => {
  10. // data:worker线程发送的信息
  11. let data: Int8Array = e.data;
  12. console.info("main thread onmessage");
  13. // 销毁Worker对象
  14. workerInstance.terminate();
  15. }
  16. // 在调用terminate后,执行回调onexit
  17. workerInstance.onexit = (code) => {
  18. console.info("main thread terminate");
  19. }
  20. workerInstance.onerror = (err: ErrorEvent) => {
  21. console.error("main error message " + err.message);
  22. }
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
  3. // 创建worker线程中与宿主线程通信的对象
  4. const workerPort = worker.workerPort;
  5. // worker线程接收宿主线程信息
  6. workerPort.onmessage = (e: MessageEvents): void => {
  7. // data:宿主线程发送的信息
  8. let data: ArrayBuffer = e.data;
  9. const view = new Int8Array(data).fill(3);
  10. console.info("worker.ets onmessage");
  11. // worker线程向宿主线程发送信息
  12. workerPort.postMessage(view);
  13. }
  14. // worker线程发生error的回调
  15. workerPort.onerror = (err: ErrorEvent) => {
  16. console.error("worker.ets onerror");
  17. }

在模块级entry/build-profile.json5配置文件中添加如下配置:

收起
自动换行
深色代码主题
复制
  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/entryability/workers/worker.ets"
  5. ]
  6. }
  7. }

Stage模型

此处以API version 18的工程为例。

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
  3. @Entry
  4. @Component
  5. struct Index {
  6. @State message: string = 'Hello World';
  7. build() {
  8. Row() {
  9. Column() {
  10. Text(this.message)
  11. .fontSize(50)
  12. .fontWeight(FontWeight.Bold)
  13. .onClick(() => {
  14. // 宿主线程中创建Worker对象
  15. const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
  16. // 宿主线程向worker线程传递信息
  17. const buffer = new ArrayBuffer(8);
  18. workerInstance.postMessage(buffer);
  19. // 宿主线程接收worker线程信息
  20. workerInstance.onmessage = (e: MessageEvents): void => {
  21. // data:worker线程发送的信息
  22. let data: Int8Array = e.data;
  23. console.info("main thread data is " + data);
  24. // 销毁Worker对象
  25. workerInstance.terminate();
  26. }
  27. // 在调用terminate后,执行onexit
  28. workerInstance.onexit = (code) => {
  29. console.info("main thread terminate");
  30. }
  31. workerInstance.onAllErrors = (err: ErrorEvent) => {
  32. console.error("main error message " + err.message);
  33. }
  34. })
  35. }
  36. .width('100%')
  37. .height('100%')
  38. }
  39. }
  40. }
收起
自动换行
深色代码主题
复制
  1. // Worker.ets
  2. import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
  3. // 创建worker线程中与宿主线程通信的对象
  4. const workerPort = worker.workerPort;
  5. // worker线程接收宿主线程信息
  6. workerPort.onmessage = (e: MessageEvents): void => {
  7. // data:宿主线程发送的信息
  8. let data: ArrayBuffer = e.data;
  9. // 往收到的buffer里写入数据
  10. const view = new Int8Array(data).fill(3);
  11. // worker线程向宿主线程发送信息
  12. workerPort.postMessage(view);
  13. }
  14. // worker线程发生error的回调
  15. workerPort.onerror = (err: ErrorEvent) => {
  16. console.error("worker.ets onerror" + err.message);
  17. }

在模块级entry/build-profile.json5配置文件中添加如下配置:

收起
自动换行
深色代码主题
复制
  1. "buildOption": {
  2. "sourceOption": {
  3. "workers": [
  4. "./src/main/ets/workers/Worker.ets"
  5. ]
  6. }
  7. }

分发事件与监听接口搭配使用示例

收起
自动换行
深色代码主题
复制
  1. // Index.ets
  2. import { worker, MessageEvents } from '@kit.ArkTS';
  3. @Entry
  4. @Component
  5. struct Index {
  6. @State message: string = 'Hello World';
  7. build() {
  8. RelativeContainer() {
  9. Text(this.message)
  10. .id('HelloWorld')
  11. .fontSize($r('app.float.page_text_font_size'))
  12. .fontWeight(FontWeight.Bold)
  13. .alignRules({
  14. center: { anchor: '__container__', align: VerticalAlign.Center },
  15. middle: { anchor: '__container__', align: HorizontalAlign.Center }
  16. })
  17. .onClick(() => {
  18. const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
  19. // 用法一:
  20. workerInstance.on("alert_on", () => {
  21. console.info("alert listener callback: alert_on");
  22. })
  23. workerInstance.once("alert_once", () => {
  24. console.info("alert listener callback: alert_once");
  25. })
  26. workerInstance.addEventListener("alert_add", () => {
  27. console.info("alert listener callback: alert_add");
  28. })
  29. // once接口创建的事件执行一次便会删除。
  30. workerInstance.dispatchEvent({type: "alert_once", timeStamp: 0}); // timeStamp暂未支持
  31. // on接口创建的事件可以一直被分发,不能主动删除。
  32. workerInstance.dispatchEvent({type: "alert_on", timeStamp: 0}); // timeStamp暂未支持
  33. workerInstance.dispatchEvent({type: "alert_on", timeStamp: 0}); // timeStamp暂未支持
  34. // addEventListener接口创建的事件可以一直被分发,不能主动删除。
  35. workerInstance.dispatchEvent({type: "alert_add", timeStamp: 0}); // timeStamp暂未支持
  36. workerInstance.dispatchEvent({type: "alert_add", timeStamp: 0}); // timeStamp暂未支持
  37. // 用法二:
  38. // event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
  39. // 当type = "message",onmessage接口定义的方法同时会执行。
  40. // 当type = "messageerror",onmessageerror接口定义的方法同时会执行。
  41. // 当type = "error",onerror接口定义的方法同时会执行。
  42. // 若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。
  43. workerInstance.addEventListener("message", () => {
  44. console.info("message listener callback");
  45. })
  46. workerInstance.onmessage = (e: MessageEvents): void => {
  47. console.info("onmessage : message listener callback");
  48. }
  49. // 调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
  50. workerInstance.dispatchEvent({type: "message", timeStamp: 0}); // timeStamp暂未支持
  51. // 向worker线程发送消息
  52. workerInstance.postMessage("test");
  53. })
  54. }
  55. .height('100%')
  56. .width('100%')
  57. }
  58. }
收起
自动换行
深色代码主题
复制
  1. // worker.ets
  2. import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
  3. const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
  4. workerPort.onmessage = (event: MessageEvents) => {
  5. console.info("worker thread recv data is: ", event.data);
  6. let data: string = event.data;
  7. const workerHandler1 = () => console.info("Handler 1 is: ", data);
  8. const workerHandler2 = () => console.info("Handler 2 is: ", data);
  9. // 注册两个监听器
  10. workerPort.addEventListener("workerListener", workerHandler1);
  11. workerPort.addEventListener("workerListener", workerHandler2);
  12. // 事件workerListener注册了两个监听器,两个监听器都会执行
  13. workerPort.dispatchEvent({type: "workerListener", timeStamp: 0}); // timeStamp暂未支持
  14. // 删除workerHandler1监听器
  15. workerPort.removeEventListener("workerListener", workerHandler1); // timeStamp暂未支持
  16. // workerHandler1监听器已删除,只有workerHandler2执行
  17. workerPort.dispatchEvent({type: "workerListener", timeStamp: 0}); // timeStamp暂未支持
  18. // 删除所有事件监听
  19. workerPort.removeAllListener();
  20. };