• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# @ohos.worker (启动一个Worker)
2
3Worker是与主线程并行的独立线程。创建Worker的线程称之为宿主线程,Worker自身的线程称之为Worker线程。创建Worker传入的url文件在Worker线程中执行,可以处理耗时操作但不可以直接操作UI。
4
5Worker主要作用是为应用程序提供一个多线程的运行环境,可满足应用程序在执行过程中与宿主线程分离,在后台线程中运行一个脚本处理耗时操作,极大避免类似于计算密集型或高延迟的任务阻塞宿主线程的运行。由于Worker一旦被创建则不会主动被销毁,若不处于任务状态一直运行,在一定程度上会造成资源的浪费,应及时关闭空闲的Worker。
6
7Worker的上下文对象和UI主线程的上下文对象是不同的,Worker线程不支持UI操作。
8
9Worker使用过程中的相关注意点请查看[Worker注意事项](../../arkts-utils/worker-introduction.md#worker注意事项)。
10
11> **说明:**<br/>
12> 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。
13
14## 导入模块
15
16```ts
17import { worker } from '@kit.ArkTS';
18```
19
20
21## 属性
22
23**系统能力:** SystemCapability.Utils.Lang
24
25| 名称                              | 类型                                                         | 可读 | 可写 | 说明                                                         |
26| --------------------------------- | ------------------------------------------------------------ | ---- | ---- | ------------------------------------------------------------ |
27| workerPort<sup>9+</sup>           | [ThreadWorkerGlobalScope](#threadworkerglobalscope9)         | 是   | 是   | worker线程用于与宿主线程通信的对象。**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。                         |
28| parentPort<sup>(deprecated)</sup> | [DedicatedWorkerGlobalScope](#dedicatedworkerglobalscopedeprecated) | 是   | 是   | worker线程用于与宿主线程通信的对象。<br/>此属性从API version 7开始支持,从API version 9开始被废弃。<br/>建议使用workerPort<sup>9+</sup>替代。 |
29
30
31## WorkerOptions
32
33Worker构造函数的选项信息,用于为Worker添加其他信息。
34
35**系统能力:** SystemCapability.Utils.Lang
36
37| 名称 | 类型 | 只读 | 可选 | 说明 |
38| ---- | -------- | ---- | ---- | -------------- |
39| type | 'classic' \| 'module' | 是   | 是 | Worker执行脚本的模式类型,暂不支持module类型,默认值为"classic"。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。 |
40| name | string   | 是   | 是 | Worker的名称,默认值为 undefined 。<br/>**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。|
41| shared | boolean | 是   | 是 | 表示Worker共享功能,此接口暂不支持。 <br/>**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。|
42| priority<sup>18+</sup> | [ThreadWorkerPriority](#threadworkerpriority18) | 是   | 是 | 表示Worker线程优先级。 <br/>**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。|
43
44
45## ThreadWorkerPriority<sup>18+</sup>
46
47Worker线程的优先级枚举,各优先级对应关系请参考[QoS等级](../../napi/qos-guidelines.md#qos等级定义)。
48
49**系统能力:** SystemCapability.Utils.Lang
50
51**原子化服务API**:从API version 18开始,该接口支持在原子化服务中使用。
52
53| 名称 | 值 | 说明 |
54| -------- | -------- | -------- |
55| HIGH   | 0    | 高优先级,对应QOS_USER_INITIATED。 |
56| MEDIUM | 1 | 中优先级,对应QOS_DEFAULT。 |
57| LOW | 2 | 低优先级,对应QOS_UTILITY。 |
58| IDLE | 3 | 后台优先级,对应QOS_BACKGROUND。 |
59
60
61## ThreadWorker<sup>9+</sup>
62
63使用以下方法前,均需先构造ThreadWorker实例,ThreadWorker类继承[WorkerEventTarget](#workereventtarget9)。
64
65### constructor<sup>9+</sup>
66
67constructor(scriptURL: string, options?: WorkerOptions)
68
69ThreadWorker构造函数。
70
71**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。
72
73**系统能力:** SystemCapability.Utils.Lang
74
75**参数:**
76
77| 参数名    | 类型                            | 必填 | 说明                                                         |
78| --------- | ------------------------------- | ---- | ------------------------------------------------------------ |
79| scriptURL | string                          | 是   | Worker线程文件的路径。<br/>路径规则详细参考[文件路径注意事项](../../arkts-utils/worker-introduction.md#文件路径注意事项)。 |
80| options   | [WorkerOptions](#workeroptions) | 否   | Worker构造的选项。                                           |
81
82**错误码:**
83
84以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
85
86| 错误码ID | 错误信息 |
87| -------- | -------- |
88| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
89| 10200003 | Worker initialization failed. |
90| 10200007 | The worker file path is invalid. |
91
92**示例:**
93
94此处以在Stage模型中Ability加载Worker文件为例,使用Library加载Worker线程文件的场景参考[文件路径注意事项](../../arkts-utils/worker-introduction.md#文件路径注意事项)。
95
96```ts
97import { worker } from '@kit.ArkTS';
98
99// 主要说明以下两种场景:
100
101// 场景1: worker文件所在路径:"entry/src/main/ets/workers/worker.ets"
102const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ets', {name:"first worker in Stage model"});
103
104// 场景2: worker文件所在路径:"testworkers/src/main/ets/ThreadFile/workers/worker.ets"
105const workerStageModel02 = new worker.ThreadWorker('testworkers/ets/ThreadFile/workers/worker.ets');
106```
107
108
109### postMessage<sup>9+</sup>
110
111postMessage(message: Object, transfer: ArrayBuffer[]): void
112
113宿主线程通过转移对象所有权的方式向Worker线程发送消息。
114
115**系统能力:** SystemCapability.Utils.Lang
116
117**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。
118
119**参数:**
120
121| 参数名   | 类型          | 必填 | 说明                                                         |
122| -------- | ------------- | ---- | ------------------------------------------------------------ |
123| message  | Object        | 是   | 发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
124| transfer | ArrayBuffer[] | 是   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用,数组不可传入null。 |
125
126**错误码:**
127
128以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
129
130| 错误码ID | 错误信息                                |
131| -------- | ----------------------------------------- |
132| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
133| 10200004 | The Worker instance is not running.           |
134| 10200006 | An exception occurred during serialization. |
135
136**示例:**
137
138```ts
139// Worker.ets
140import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
141
142// 创建worker线程中与宿主线程通信的对象
143const workerPort = worker.workerPort
144
145// worker线程接收宿主线程信息
146workerPort.onmessage = (e: MessageEvents): void => {
147  // data:宿主线程发送的信息
148  let data: number = e.data;
149  // 往收到的buffer里写入数据
150  const view = new Int8Array(data).fill(3);
151  // worker线程向宿主线程发送信息
152  workerPort.postMessage(view);
153}
154
155// worker线程发生error的回调
156workerPort.onerror = (err: ErrorEvent) => {
157  console.log("worker.ets onerror" + err.message);
158}
159```
160```ts
161// Index.ets
162import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
163
164@Entry
165@Component
166struct Index {
167  @State message: string = 'Hello World';
168
169  build() {
170    Row() {
171      Column() {
172        Text(this.message)
173          .fontSize(50)
174          .fontWeight(FontWeight.Bold)
175          .onClick(() => {
176            // 宿主线程中创建Worker对象
177            const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
178            // 宿主线程向worker线程传递信息
179            const buffer = new ArrayBuffer(8);
180            workerInstance.postMessage(buffer, [buffer]);
181            // 宿主线程接收worker线程信息
182            workerInstance.onmessage = (e: MessageEvents): void => {
183              // data:worker线程发送的信息
184              let data: number = e.data;
185              console.info("main thread data is  " + data);
186              // 销毁Worker对象
187              workerInstance.terminate();
188            }
189            // 在调用terminate后,执行onexit
190            workerInstance.onexit = (code) => {
191              console.log("main thread terminate");
192            }
193
194            workerInstance.onAllErrors = (err: ErrorEvent) => {
195              console.log("main error message " + err.message);
196            }
197          })
198      }
199      .width('100%')
200      .height('100%')
201    }
202  }
203}
204```
205
206### postMessage<sup>9+</sup>
207
208postMessage(message: Object, options?: PostMessageOptions): void
209
210宿主线程通过转移对象所有权或者拷贝数据的方式向Worker线程发送消息。
211
212**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。
213
214**系统能力:** SystemCapability.Utils.Lang
215
216**参数:**
217
218| 参数名  | 类型                                      | 必填 | 说明                                                         |
219| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
220| message | Object                                    | 是   | 发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
221| options | [PostMessageOptions](#postmessageoptions) | 否   | 当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用。<br>若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到Worker线程。 |
222
223**错误码:**
224
225以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
226
227| 错误码ID | 错误信息                                |
228| -------- | ----------------------------------------- |
229| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
230| 10200004 | The Worker instance is not running.           |
231| 10200006 | An exception occurred during serialization. |
232
233**示例:**
234
235```ts
236const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
237
238workerInstance.postMessage("hello world");
239
240let buffer = new ArrayBuffer(8);
241workerInstance.postMessage(buffer, [buffer]);
242```
243
244
245### postMessageWithSharedSendable<sup>12+</sup>
246
247postMessageWithSharedSendable(message: Object, transfer?: ArrayBuffer[]): void
248
249宿主线程向Worker线程发送消息。消息中的Sendable对象通过引用传递,非Sendable对象通过序列化传递。
250
251**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。
252
253**系统能力:** SystemCapability.Utils.Lang
254
255**参数:**
256
257| 参数名  | 类型                                      | 必填 | 说明                                                         |
258| --------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
259| message   | Object	     | 是   | 发送至Worker的数据,该数据对象必须是可序列化或可共享,序列化支持类型见[序列化类型说明](#序列化支持类型),共享支持类型见[Sendable支持的数据类型](../../arkts-utils/arkts-sendable.md#sendable支持的数据类型)。 |
260| transfer  | ArrayBuffer[] | 否   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用,数组不可传入null。默认值为空数组。 |
261
262**错误码:**
263
264以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
265
266| 错误码ID | 错误信息                                |
267| -------- | ----------------------------------------- |
268| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
269| 10200004 | The Worker instance is not running.           |
270| 10200006 | An exception occurred during serialization. |
271
272**示例:**
273
274<!--code_no_check-->
275```ts
276// index.ets
277// 新建SendableObject实例并通过宿主线程传递至worker线程
278
279import { worker } from '@kit.ArkTS';
280import { SendableObject } from './sendable'
281
282const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
283let object: SendableObject = new SendableObject();
284workerInstance.postMessageWithSharedSendable(object);
285```
286
287```ts
288// sendable.ets
289// 定义SendableObject
290
291@Sendable
292export class SendableObject {
293  a:number = 45;
294}
295```
296
297<!--code_no_check-->
298```ts
299// worker文件路径为:entry/src/main/ets/workers/Worker.ets
300// Worker.ets
301// 接收宿主线程传递至worker线程的数据并访问
302
303import { SendableObject } from '../pages/sendable'
304import { worker, ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@kit.ArkTS';
305
306const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
307workerPort.onmessage = (e: MessageEvents) => {
308  let obj: SendableObject = e.data;
309  console.info("sendable obj is: " + obj.a);
310}
311```
312
313
314### on<sup>9+</sup>
315
316on(type: string, listener: WorkerEventListener): void
317
318向Worker添加一个事件监听,该接口与[addEventListener<sup>9+</sup>](#addeventlistener9)接口功能一致。
319
320**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
321
322**系统能力:** SystemCapability.Utils.Lang
323
324**参数:**
325
326| 参数名   | 类型                                         | 必填 | 说明                   |
327| -------- | -------------------------------------------- | ---- | ---------------------- |
328| type     | string                                       | 是   | 监听的事件类型。       |
329| listener | [WorkerEventListener](#workereventlistener9) | 是 | 回调的事件。 |
330
331**错误码:**
332
333以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
334
335| 错误码ID | 错误信息                                   |
336| -------- | -------------------------------------------- |
337| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
338| 10200004 | Worker instance is not running.              |
339| 10200005 | The invoked API is not supported in workers. |
340
341**示例:**
342
343```ts
344const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
345workerInstance.on("alert", ()=>{
346    console.log("alert listener callback");
347})
348```
349
350
351### once<sup>9+</sup>
352
353once(type: string, listener: WorkerEventListener): void
354
355向Worker添加一个事件监听,该事件监听只执行一次便自动删除。
356
357**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
358
359**系统能力:** SystemCapability.Utils.Lang
360
361**参数:**
362
363| 参数名   | 类型                                         | 必填 | 说明                   |
364| -------- | -------------------------------------------- | ---- | ---------------------- |
365| type     | string                                       | 是   | 监听的事件类型。       |
366| listener | [WorkerEventListener](#workereventlistener9) | 是 | 回调的事件。 |
367
368**错误码:**
369
370以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
371
372| 错误码ID | 错误信息                                   |
373| -------- | -------------------------------------------- |
374| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
375| 10200004 | Worker instance is not running.              |
376| 10200005 | The invoked API is not supported in workers. |
377
378**示例:**
379
380```ts
381const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
382workerInstance.once("alert", ()=>{
383    console.log("alert listener callback");
384})
385```
386
387
388### off<sup>9+</sup>
389
390off(type: string, listener?: WorkerEventListener): void
391
392删除类型为type的事件监听,该接口与[removeEventListener<sup>9+</sup>](#removeeventlistener9)接口功能一致。
393
394**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
395
396**系统能力:** SystemCapability.Utils.Lang
397
398**参数:**
399
400| 参数名   | 类型                                         | 必填 | 说明                         |
401| -------- | -------------------------------------------- | ---- | ---------------------------- |
402| type     | string                                       | 是   | 需要删除的事件类型。         |
403| listener | [WorkerEventListener](#workereventlistener9) | 否 | 删除监听事件后所执行的回调事件。 |
404
405**错误码:**
406
407以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
408
409| 错误码ID | 错误信息                                   |
410| -------- | -------------------------------------------- |
411| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
412| 10200004 | Worker instance is not running.              |
413| 10200005 | The invoked API is not supported in workers. |
414
415**示例:**
416
417```ts
418const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
419//使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
420workerInstance.off("alert");
421```
422
423### registerGlobalCallObject<sup>11+</sup>
424
425registerGlobalCallObject(instanceName: string, globalCallObject: Object): void
426
427在宿主线程的ThreadWorker实例上注册一个对象,该对象上的方法可以在Worker线程中被调用,详细介绍请参见[callGlobalCallObjectMethod](#callglobalcallobjectmethod11)。
428
429**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
430
431**系统能力:** SystemCapability.Utils.Lang
432
433**参数:**
434
435| 参数名   | 类型          | 必填 | 说明                                                         |
436| -------- | ------------- | ---- | ------------------------------------------------------------ |
437| instanceName  | string        | 是   | 注册对象时使用的键,调用时可以通过该键值找到相对应的被注册的对象。 |
438| globalCallObject | Object | 是   | 被注册的对象,ThreadWorker实例会持有被注册对象的强引用。 |
439
440**错误码:**
441
442以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
443
444| 错误码ID | 错误信息                                |
445| -------- | ----------------------------------------- |
446| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
447| 10200004 | Worker instance is not running.           |
448
449**示例:**
450```ts
451//Index.ets
452const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
453class TestObj {
454  private message : string = "this is a message from TestObj"
455  public getMessage() : string {
456    return this.message;
457  }
458  public getMessageWithInput(str : string) : string {
459    return this.message + " with input: " + str;
460  }
461}
462let registerObj = new TestObj();
463// 在ThreadWorker实例上注册registerObj
464workerInstance.registerGlobalCallObject("myObj", registerObj);
465workerInstance.postMessage("start worker")
466```
467
468```ts
469// worker.ets
470import { worker, MessageEvents } from '@kit.ArkTS';
471
472const workerPort = worker.workerPort;
473workerPort.onmessage = (e: MessageEvents): void => {
474  try {
475    // 调用方法无入参
476    let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessage", 0) as string;
477    console.info("worker:", res) // worker: this is a message from TestObj
478  } catch (error) {
479    // 异常处理
480    console.error("worker: error code is " + error.code + " error message is " + error.message);
481  }
482  try {
483    // 调用方法有入参
484    let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessageWithInput", 0, "hello there!") as string;
485    console.info("worker:", res) //worker: this is a message from TestObj with input: hello there!
486  } catch (error) {
487    // 异常处理
488    console.error("worker: error code is " + error.code + " error message is " + error.message);
489  }
490}
491```
492
493### unregisterGlobalCallObject<sup>11+</sup>
494
495unregisterGlobalCallObject(instanceName?: string): void
496
497取消在宿主线程ThreadWorker实例上注册的对象,该方法会释放ThreadWorker实例中与该键相匹配的对象的强引用。如果没有匹配的对象,该方法不会报错。
498
499**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
500
501**系统能力:** SystemCapability.Utils.Lang
502
503**参数:**
504
505| 参数名   | 类型          | 必填 | 说明                                                         |
506| -------- | ------------- | ---- | ------------------------------------------------------------ |
507| instanceName  | string        | 否   | 注册对象时使用的键,此参数不填时,会释放ThreadWorker实例中所有已注册的对象。 |
508
509**错误码:**
510
511以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
512
513| 错误码ID | 错误信息                                |
514| -------- | ----------------------------------------- |
515| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
516| 10200004 | Worker instance is not running. |
517
518**示例:**
519```ts
520const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
521class TestObj {
522  private message : string = "this is a message from TestObj"
523  public getMessage() : string {
524    return this.message;
525  }
526  public getMessageWithInput(str : string) : string {
527    return this.message + " with input: " + str;
528  }
529}
530let registerObj = new TestObj();
531workerInstance.registerGlobalCallObject("myObj", registerObj);
532// 取消对象注册
533workerInstance.unregisterGlobalCallObject("myObj");
534// 取消ThreadWorker实例上的所有对象注册
535//workerInstance.unregisterGlobalCallObject();
536workerInstance.postMessage("start worker")
537```
538
539### terminate<sup>9+</sup>
540
541terminate(): void
542
543销毁Worker线程,终止Worker接收消息。
544
545**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
546
547**系统能力:** SystemCapability.Utils.Lang
548
549**错误码:**
550
551以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
552
553| 错误码ID | 错误信息                      |
554| -------- | ------------------------------- |
555| 10200004 | The Worker instance is not running. |
556
557**示例:**
558
559```ts
560const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
561workerInstance.terminate();
562```
563
564
565### onexit<sup>9+</sup>
566
567onexit?: (code: number) =&gt; void
568
569回调函数。表示Worker销毁时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中code类型为number,异常退出为1,正常退出为0。
570
571**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
572
573**系统能力:** SystemCapability.Utils.Lang
574
575**错误码:**
576
577以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
578
579| 错误码ID | 错误信息                                   |
580| -------- | -------------------------------------------- |
581| 401      | Parameter error. Possible causes: 1.Incorrect parameter types. |
582| 10200004 | The Worker instance is not running.              |
583| 10200005 | The called API is not supported in the worker thread. |
584
585**示例:**
586
587```ts
588const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
589workerInstance.onexit = (code) => {
590 console.log("onexit");
591}
592
593//onexit被执行两种方式:
594// main thread:
595workerInstance.terminate();
596
597// worker线程:
598//workerPort.close()
599```
600
601
602### onerror<sup>9+</sup>
603
604onerror?: (err: ErrorEvent) =&gt; void
605
606回调函数。表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中err类型为[ErrorEvent](#errorevent),表示收到的异常数据。
607
608**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
609
610**系统能力:** SystemCapability.Utils.Lang
611
612**错误码:**
613
614以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
615
616| 错误码ID | 错误信息                                   |
617| -------- | -------------------------------------------- |
618| 401      | Parameter error. Possible causes: 1.Incorrect parameter types. |
619| 10200004 | The Worker instance is not running.              |
620| 10200005 | The called API is not supported in the worker thread. |
621
622**示例:**
623
624```ts
625import { worker, ErrorEvent } from '@kit.ArkTS';
626
627const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
628workerInstance.onerror = (err: ErrorEvent) => {
629  console.log("onerror" + err.message);
630}
631```
632
633### onAllErrors<sup>18+</sup>
634
635onAllErrors?: ErrorCallback
636
637回调函数。表示Worker线程生命周期内发生异常被调用的事件处理程序,处理程序在宿主线程中执行。<br/>
638[onerror](#onerror9)仅捕获[onmessage](#onmessage9)回调中同步方法产生的异常,无法捕获多线程回调产生的异常和模块化相关异常,且onerror捕获异常后Worker线程进入销毁流程,不可以继续使用。<br/>
639onAllErrors可以捕获Worker线程的onmessage回调、timer回调以及文件执行等过程中产生的全局异常,且onAllErrors捕获异常后Worker线程仍存活,可以继续使用。因此,推荐使用onAllErrors代替onerror。
640
641**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
642
643**系统能力:** SystemCapability.Utils.Lang
644
645**错误码:**
646
647以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
648
649| 错误码ID | 错误信息                                   |
650| -------- | -------------------------------------------- |
651| 10200004 | The Worker instance is not running.              |
652| 10200005 | The called API is not supported in the worker thread. |
653
654**示例:**
655
656```ts
657import { worker, ErrorEvent } from '@kit.ArkTS';
658
659const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
660workerInstance.onAllErrors = (err: ErrorEvent) => {
661  console.log("onAllErrors" + err.message);
662}
663```
664
665### onmessage<sup>9+</sup>
666
667onmessage?: (event: MessageEvents) =&gt; void
668
669回调函数。表示宿主线程接收到来自其创建的Worker通过workerPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中event类型为[MessageEvents](#messageevents9),表示收到的Worker消息数据。
670
671**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
672
673**系统能力:** SystemCapability.Utils.Lang
674
675**错误码:**
676
677以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
678
679| 错误码ID | 错误信息                                   |
680| -------- | -------------------------------------------- |
681| 401      | Parameter error. Possible causes: 1.Incorrect parameter types. |
682| 10200004 | The Worker instance is not running.              |
683| 10200005 | The called API is not supported in the worker thread. |
684
685**示例:**
686
687```ts
688import { worker, MessageEvents } from '@kit.ArkTS';
689
690const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
691workerInstance.onmessage = (e: MessageEvents): void => {
692 // e : MessageEvents, 用法如下:
693 // let data = e.data;
694 console.log("onmessage");
695}
696```
697
698
699### onmessageerror<sup>9+</sup>
700
701onmessageerror?: (event: MessageEvents) =&gt; void
702
703回调函数。表示当Worker对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中event类型为[MessageEvents](#messageevents9),表示收到的Worker消息数据。
704
705**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
706
707**系统能力:** SystemCapability.Utils.Lang
708
709**错误码:**
710
711以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
712
713| 错误码ID | 错误信息                                   |
714| -------- | -------------------------------------------- |
715| 401      | Parameter error. Possible causes: 1.Incorrect parameter types. |
716| 10200004 | The Worker instance is not running.              |
717| 10200005 | The called API is not supported in the worker thread. |
718
719**示例:**
720
721```ts
722import { worker, MessageEvents } from '@kit.ArkTS';
723
724const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
725workerInstance.onmessageerror = (err: MessageEvents) => {
726  console.log("onmessageerror");
727}
728```
729
730### addEventListener<sup>9+</sup>
731
732addEventListener(type: string, listener: WorkerEventListener): void
733
734向Worker添加一个事件监听,该接口与[on<sup>9+</sup>](#on9)接口功能一致。
735
736**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
737
738**系统能力:** SystemCapability.Utils.Lang
739
740**参数:**
741
742| 参数名   | 类型                                         | 必填 | 说明             |
743| -------- | -------------------------------------------- | ---- | ---------------- |
744| type     | string                                       | 是   | 监听的事件类型。 |
745| listener | [WorkerEventListener](#workereventlistener9) | 是   | 回调的事件。     |
746
747**错误码:**
748
749以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
750
751| 错误码ID | 错误信息                                   |
752| -------- | -------------------------------------------- |
753| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
754| 10200004 | Worker instance is not running.              |
755| 10200005 | The invoked API is not supported in workers. |
756
757**示例:**
758
759```ts
760const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
761workerInstance.addEventListener("alert", ()=>{
762    console.log("alert listener callback");
763})
764```
765
766
767### removeEventListener<sup>9+</sup>
768
769removeEventListener(type: string, callback?: WorkerEventListener): void
770
771删除Worker的事件监听,该接口与[off<sup>9+</sup>](#off9)接口功能一致。
772
773**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
774
775**系统能力:** SystemCapability.Utils.Lang
776
777**参数:**
778
779| 参数名   | 类型                                         | 必填 | 说明                         |
780| -------- | -------------------------------------------- | ---- | ---------------------------- |
781| type     | string                                       | 是   | 需要删除的监听事件类型。     |
782| callback | [WorkerEventListener](#workereventlistener9) | 否 | 删除监听事件后所执行的回调事件。 |
783
784**错误码:**
785
786以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
787
788| 错误码ID | 错误信息                      |
789| -------- | ------------------------------- |
790| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
791| 10200004 | Worker instance is not running. |
792
793**示例:**
794
795```ts
796const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
797workerInstance.addEventListener("alert", ()=>{
798    console.log("alert listener callback");
799})
800workerInstance.removeEventListener("alert");
801```
802
803
804### dispatchEvent<sup>9+</sup>
805
806dispatchEvent(event: Event): boolean
807
808分发定义在Worker的事件。
809
810**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
811
812**系统能力:** SystemCapability.Utils.Lang
813
814**参数:**
815
816| 参数名 | 类型            | 必填 | 说明             |
817| ------ | --------------- | ---- | ---------------- |
818| event  | [Event](#event) | 是   | 需要分发的事件。 |
819
820**返回值:**
821
822| 类型    | 说明                            |
823| ------- | ------------------------------- |
824| boolean | 分发的结果。true表示分发成功,false表示分发失败。 |
825
826**错误码:**
827
828以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
829
830| 错误码ID | 错误信息                      |
831| -------- | ------------------------------- |
832| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
833| 10200004 | Worker instance is not running. |
834
835**示例:**
836
837```ts
838const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
839
840workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。
841```
842
843分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,示例如下:
844
845```ts
846import { worker, MessageEvents } from '@kit.ArkTS';
847
848const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
849
850//用法一:
851workerInstance.on("alert_on", ()=>{
852    console.log("alert listener callback");
853})
854workerInstance.once("alert_once", ()=>{
855    console.log("alert listener callback");
856})
857workerInstance.addEventListener("alert_add", ()=>{
858    console.log("alert listener callback");
859})
860
861//once接口创建的事件执行一次便会删除。
862workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
863//on接口创建的事件可以一直被分发,不能主动删除。
864workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
865workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
866//addEventListener接口创建的事件可以一直被分发,不能主动删除。
867workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
868workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
869
870//用法二:
871//event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
872//当type = "message",onmessage接口定义的方法同时会执行。
873//当type = "messageerror",onmessageerror接口定义的方法同时会执行。
874//当type = "error",onerror接口定义的方法同时会执行。
875//若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。
876
877workerInstance.addEventListener("message", ()=>{
878    console.log("message listener callback");
879})
880workerInstance.onmessage = (e: MessageEvents): void => {
881    console.log("onmessage : message listener callback");
882}
883//调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
884workerInstance.dispatchEvent({type:"message", timeStamp:0});
885```
886
887
888### removeAllListener<sup>9+</sup>
889
890removeAllListener(): void
891
892删除Worker所有的事件监听。
893
894**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
895
896**系统能力:** SystemCapability.Utils.Lang
897
898**错误码:**
899
900以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
901
902| 错误码ID | 错误信息                      |
903| -------- | ------------------------------- |
904| 10200004 | Worker instance is not running. |
905
906**示例:**
907
908```ts
909const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
910workerInstance.addEventListener("alert", ()=>{
911    console.log("alert listener callback");
912})
913workerInstance.removeAllListener();
914```
915
916## WorkerEventTarget<sup>9+</sup>
917
918处理Worker监听事件。
919
920### addEventListener<sup>9+</sup>
921
922addEventListener(type: string, listener: WorkerEventListener): void
923
924向Worker添加一个事件监听,该接口与[on<sup>9+</sup>](#on9)接口功能一致。
925
926**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
927
928**系统能力:** SystemCapability.Utils.Lang
929
930**参数:**
931
932| 参数名   | 类型                                         | 必填 | 说明             |
933| -------- | -------------------------------------------- | ---- | ---------------- |
934| type     | string                                       | 是   | 监听的事件类型。 |
935| listener | [WorkerEventListener](#workereventlistener9) | 是   | 回调的事件。     |
936
937**错误码:**
938
939以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
940
941| 错误码ID | 错误信息                                   |
942| -------- | -------------------------------------------- |
943| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
944| 10200004 | The Worker instance is not running.              |
945| 10200005 | The called API is not supported in the worker thread. |
946
947**示例:**
948
949```ts
950const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
951workerInstance.addEventListener("alert", ()=>{
952    console.log("alert listener callback");
953})
954```
955
956
957### removeEventListener<sup>9+</sup>
958
959removeEventListener(type: string, callback?: WorkerEventListener): void
960
961删除Worker的事件监听,该接口与[off<sup>9+</sup>](#off9)接口功能一致。
962
963**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
964
965**系统能力:** SystemCapability.Utils.Lang
966
967**参数:**
968
969| 参数名   | 类型                                         | 必填 | 说明                         |
970| -------- | -------------------------------------------- | ---- | ---------------------------- |
971| type     | string                                       | 是   | 需要删除的监听事件类型。     |
972| callback | [WorkerEventListener](#workereventlistener9) | 否 | 删除监听事件后所执行的回调事件。 |
973
974**错误码:**
975
976以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
977
978| 错误码ID | 错误信息                      |
979| -------- | ------------------------------- |
980| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
981| 10200004 | The Worker instance is not running. |
982
983**示例:**
984
985```ts
986const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
987workerInstance.addEventListener("alert", ()=>{
988    console.log("alert listener callback");
989})
990workerInstance.removeEventListener("alert");
991```
992
993
994### dispatchEvent<sup>9+</sup>
995
996dispatchEvent(event: Event): boolean
997
998分发定义在Worker的事件。
999
1000**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1001
1002**系统能力:** SystemCapability.Utils.Lang
1003
1004**参数:**
1005
1006| 参数名 | 类型            | 必填 | 说明             |
1007| ------ | --------------- | ---- | ---------------- |
1008| event  | [Event](#event) | 是   | 需要分发的事件。 |
1009
1010**返回值:**
1011
1012| 类型    | 说明                            |
1013| ------- | ------------------------------- |
1014| boolean | 分发的结果。true表示分发成功,false表示分发失败。 |
1015
1016**错误码:**
1017
1018以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
1019
1020| 错误码ID | 错误信息                      |
1021| -------- | ------------------------------- |
1022| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
1023| 10200004 | The Worker instance is not running. |
1024
1025**示例:**
1026
1027```ts
1028const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1029
1030workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); //timeStamp暂未支持。
1031```
1032
1033分发事件(dispatchEvent)可与监听接口(on、once、addEventListener)搭配使用,示例如下:
1034
1035```ts
1036import { worker, MessageEvents } from '@kit.ArkTS';
1037
1038const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1039
1040//用法一:
1041workerInstance.on("alert_on", ()=>{
1042    console.log("alert listener callback");
1043})
1044workerInstance.once("alert_once", ()=>{
1045    console.log("alert listener callback");
1046})
1047workerInstance.addEventListener("alert_add", ()=>{
1048    console.log("alert listener callback");
1049})
1050
1051//once接口创建的事件执行一次便会删除。
1052workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});//timeStamp暂未支持。
1053//on接口创建的事件可以一直被分发,不能主动删除。
1054workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
1055workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
1056//addEventListener接口创建的事件可以一直被分发,不能主动删除。
1057workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
1058workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
1059
1060//用法二:
1061//event类型的type支持自定义,同时存在"message"/"messageerror"/"error"特殊类型,如下所示
1062//当type = "message",onmessage接口定义的方法同时会执行。
1063//当type = "messageerror",onmessageerror接口定义的方法同时会执行。
1064//当type = "error",onerror接口定义的方法同时会执行。
1065//若调用removeEventListener接口或者off接口取消事件时,能且只能取消使用addEventListener/on/once创建的事件。
1066
1067workerInstance.addEventListener("message", ()=>{
1068    console.log("message listener callback");
1069})
1070workerInstance.onmessage = (e: MessageEvents): void => {
1071    console.log("onmessage : message listener callback");
1072}
1073//调用dispatchEvent分发“message”事件,addEventListener和onmessage中定义的方法都会被执行。
1074workerInstance.dispatchEvent({type:"message", timeStamp:0});
1075```
1076
1077
1078### removeAllListener<sup>9+</sup>
1079
1080removeAllListener(): void
1081
1082删除Worker所有的事件监听。
1083
1084**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1085
1086**系统能力:** SystemCapability.Utils.Lang
1087
1088**错误码:**
1089
1090以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
1091
1092| 错误码ID | 错误信息                      |
1093| -------- | ------------------------------- |
1094| 10200004 | The Worker instance is not running. |
1095
1096**示例:**
1097
1098```ts
1099const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1100workerInstance.addEventListener("alert", ()=>{
1101    console.log("alert listener callback");
1102})
1103workerInstance.removeAllListener();
1104```
1105
1106
1107## ThreadWorkerGlobalScope<sup>9+</sup>
1108
1109Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口销毁Worker线程。ThreadWorkerGlobalScope类继承[GlobalScope<sup>9+</sup>](#globalscope9)。
1110
1111### postMessage<sup>9+</sup>
1112
1113postMessage(messageObject: Object, transfer: ArrayBuffer[]): void;
1114
1115Worker线程通过转移对象所有权的方式向宿主线程发送消息。
1116
1117**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1118
1119**系统能力:** SystemCapability.Utils.Lang
1120
1121**参数:**
1122
1123| 参数名   | 类型          | 必填 | 说明                                                         |
1124| -------- | ------------- | ---- | ------------------------------------------------------------ |
1125| messageObject  | Object        | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
1126| transfer | ArrayBuffer[] | 是   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。 |
1127
1128**错误码:**
1129
1130以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
1131
1132| 错误码ID | 错误信息                                |
1133| -------- | ----------------------------------------- |
1134| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
1135| 10200004 | The Worker instance is not running.           |
1136| 10200006 | An exception occurred during serialization. |
1137
1138**示例:**
1139
1140```ts
1141// main thread
1142import { worker, MessageEvents } from '@kit.ArkTS';
1143
1144const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1145workerInstance.postMessage("hello world");
1146workerInstance.onmessage = (e: MessageEvents): void => {
1147    console.log("receive data from worker.ets");
1148}
1149```
1150
1151```ts
1152// worker.ets
1153import { worker, MessageEvents } from '@kit.ArkTS';
1154
1155const workerPort = worker.workerPort;
1156workerPort.onmessage = (e: MessageEvents): void => {
1157    let buffer = new ArrayBuffer(8);
1158    workerPort.postMessage(buffer, [buffer]);
1159}
1160```
1161
1162### postMessage<sup>9+</sup>
1163
1164postMessage(messageObject: Object, options?: PostMessageOptions): void
1165
1166Worker线程通过转移对象所有权或者拷贝数据的方式向宿主线程发送消息。
1167
1168**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1169
1170**系统能力:** SystemCapability.Utils.Lang
1171
1172**参数:**
1173
1174| 参数名  | 类型                                      | 必填 | 说明                                                         |
1175| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
1176| messageObject | Object                                    | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
1177| options | [PostMessageOptions](#postmessageoptions) | 否   | 当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用。<br/>若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到宿主线程。 |
1178
1179**错误码:**
1180
1181以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
1182
1183| 错误码ID | 错误信息                                |
1184| -------- | ----------------------------------------- |
1185| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
1186| 10200004 | The Worker instance is not running.           |
1187| 10200006 | An exception occurred during serialization. |
1188
1189**示例:**
1190
1191```ts
1192// main thread
1193import { worker, MessageEvents } from '@kit.ArkTS';
1194
1195const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1196workerInstance.postMessage("hello world");
1197workerInstance.onmessage = (e: MessageEvents): void => {
1198    console.log("receive data from worker.ets");
1199}
1200```
1201
1202```ts
1203// worker.ets
1204import { worker, MessageEvents } from '@kit.ArkTS';
1205
1206const workerPort = worker.workerPort;
1207workerPort.onmessage = (e: MessageEvents): void => {
1208    workerPort.postMessage("receive data from main thread");
1209}
1210```
1211
1212
1213### postMessageWithSharedSendable<sup>12+</sup>
1214
1215postMessageWithSharedSendable(message: Object, transfer?: ArrayBuffer[]): void
1216
1217Worker线程向宿主线程发送消息,消息中的Sendable对象通过引用传递,消息中的非Sendable对象通过序列化传递。
1218
1219**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。
1220
1221**系统能力:** SystemCapability.Utils.Lang
1222
1223**参数:**
1224
1225| 参数名  | 类型                                      | 必填 | 说明                                                         |
1226| --------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
1227| message   | Object	     | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化或可共享,序列化支持类型见[序列化类型说明](#序列化支持类型),共享支持类型见[Sendable支持的数据类型](../../arkts-utils/arkts-sendable.md#sendable支持的数据类型)。 |
1228| transfer  | ArrayBuffer[] | 否   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。默认值为空数组。 |
1229
1230**错误码:**
1231
1232以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
1233
1234| 错误码ID | 错误信息                                |
1235| -------- | ----------------------------------------- |
1236| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
1237| 10200004 | The Worker instance is not running.           |
1238| 10200006 | An exception occurred during serialization. |
1239
1240**示例:**
1241
1242<!--code_no_check-->
1243```ts
1244// worker文件路径为:entry/src/main/ets/workers/Worker.ets
1245// Worker.ets
1246// 新建SendableObject实例并通过worker线程传递至宿主线程
1247
1248import { SendableObject } from '../pages/sendable'
1249import { worker, ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@kit.ArkTS';
1250
1251const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
1252workerPort.onmessage = (e: MessageEvents) => {
1253  let object: SendableObject = new SendableObject();
1254  workerPort.postMessageWithSharedSendable(object);
1255}
1256```
1257
1258```ts
1259// sendable.ets
1260// 定义SendableObject
1261
1262@Sendable
1263export class SendableObject {
1264  a:number = 45;
1265}
1266```
1267
1268<!--code_no_check-->
1269```ts
1270// Index.ets
1271// 接收worker线程传递至宿主线程的数据并访问其属性
1272
1273import { worker, MessageEvents } from '@kit.ArkTS';
1274import { SendableObject } from './sendable'
1275
1276const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
1277workerInstance.postMessage(1);
1278workerInstance.onmessage = (e: MessageEvents) => {
1279  let obj: SendableObject = e.data;
1280  console.info("sendable index obj is: " + obj.a);
1281}
1282```
1283
1284
1285### callGlobalCallObjectMethod<sup>11+</sup>
1286
1287callGlobalCallObjectMethod(instanceName: string, methodName: string, timeout: number, ...args: Object[]): Object
1288
1289Worker线程调用注册在宿主线程上某个对象的指定方法,调用对于Worker线程是同步的,对于宿主线程是异步的,返回值通过序列化传递。
1290
1291**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1292
1293**系统能力:** SystemCapability.Utils.Lang
1294
1295**参数:**
1296
1297| 参数名  | 类型                                      | 必填 | 说明                                                         |
1298| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
1299| instanceName | string                                    | 是   | 注册对象时使用的键,用于在宿主线程查找对象。 |
1300| methodName | string | 是 | 在已注册对象上调用的方法名,注意该方法不能为使用async或generator修饰的方法,或底层使用了异步机制等异步返回结果的方法,否则会抛出异常。 |
1301| timeout | number | 是 | 本次同步调用的等待时间单位为ms,取整数,取值范围为[1-5000]ms。也可取特殊值0,此时表示本次调用等待时间为5000ms。 |
1302| args | Object[] | 否 | 注册对象上所调用方法的参数数组。 |
1303
1304**返回值:**
1305
1306| 类型                                  | 说明                            |
1307| ------------------------------------- | ------------------------------- |
1308| Object | 返回值为调用方法在宿主线程的返回值,该返回值必须是可序列化的,具体可见序列化支持类型。|
1309
1310**错误码:**
1311
1312以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
1313
1314| 错误码ID | 错误信息                                |
1315| -------- | ----------------------------------------- |
1316| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
1317| 10200004 | Worker instance is not running.           |
1318| 10200006 | An exception occurred during serialization. |
1319| 10200019 | The globalCallObject is not registered. |
1320| 10200020 | The method to be called is not callable or is an async method or a generator. |
1321| 10200021 | The global call exceeds the timeout. |
1322
1323**示例:**
1324```ts
1325//Index.ets
1326const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1327class TestObj {
1328  private message : string = "this is a message from TestObj"
1329  public getMessage() : string {
1330    return this.message;
1331  }
1332  public getMessageWithInput(str : string) : string {
1333    return this.message + " with input: " + str;
1334  }
1335}
1336let registerObj = new TestObj();
1337// 在ThreadWorker实例上注册registerObj
1338workerInstance.registerGlobalCallObject("myObj", registerObj);
1339workerInstance.postMessage("start worker")
1340```
1341
1342```ts
1343// worker.ets
1344import { worker, MessageEvents } from '@kit.ArkTS';
1345
1346const workerPort = worker.workerPort;
1347workerPort.onmessage = (e: MessageEvents): void => {
1348  try {
1349    // 调用方法无入参
1350    let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessage", 0) as string;
1351    console.info("worker:", res) // worker: this is a message from TestObj
1352  } catch (error) {
1353    // 异常处理
1354    console.error("worker: error code is " + error.code + " error message is " + error.message);
1355  }
1356  try {
1357    // 调用方法有入参
1358    let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessageWithInput", 0, "hello there!") as string;
1359    console.info("worker:", res) //worker: this is a message from TestObj with input: hello there!
1360  } catch (error) {
1361    // 异常处理
1362    console.error("worker: error code is " + error.code + " error message is " + error.message);
1363  }
1364}
1365```
1366
1367### close<sup>9+</sup>
1368
1369close(): void
1370
1371销毁Worker线程,终止Worker接收消息。
1372
1373**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1374
1375**系统能力:** SystemCapability.Utils.Lang
1376
1377**错误码:**
1378
1379以下错误码的详细介绍请参见[语言基础类库错误码](errorcode-utils.md)。
1380
1381| 错误码ID | 错误信息                      |
1382| -------- | ------------------------------- |
1383| 10200004 | The Worker instance is not running. |
1384
1385**示例:**
1386
1387```ts
1388// main thread
1389import { worker } from '@kit.ArkTS';
1390
1391const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1392```
1393
1394```ts
1395// worker.ets
1396import { worker, MessageEvents } from '@kit.ArkTS';
1397
1398const workerPort = worker.workerPort;
1399workerPort.onmessage = (e: MessageEvents): void => {
1400    workerPort.close()
1401}
1402```
1403
1404
1405### onmessage<sup>9+</sup>
1406
1407onmessage?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) =&gt; void
1408
1409回调函数。ThreadWorkerGlobalScope的onmessage属性表示Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。其中this指调用者对象本身[ThreadWorkerGlobalScope](#threadworkerglobalscope9),ev类型为[MessageEvents](#messageevents9),表示收到的Worker消息数据。
1410
1411**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1412
1413**系统能力:** SystemCapability.Utils.Lang
1414
1415**错误码:**
1416
1417以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
1418
1419| 错误码ID | 错误信息                                   |
1420| -------- | -------------------------------------------- |
1421| 401      | Parameter error. Possible causes: 1. Incorrect parameter types. |
1422| 10200004 | The Worker instance is not running.              |
1423| 10200005 | The called API is not supported in the worker thread. |
1424
1425**示例:**
1426
1427```ts
1428// main thread
1429import { worker } from '@kit.ArkTS';
1430
1431const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1432workerInstance.postMessage("hello world");
1433```
1434
1435```ts
1436// worker.ets
1437import { worker, MessageEvents } from '@kit.ArkTS';
1438
1439const workerPort = worker.workerPort;
1440workerPort.onmessage = (e: MessageEvents): void => {
1441    console.log("receive main thread message");
1442}
1443```
1444
1445
1446### onmessageerror<sup>9+</sup>
1447
1448onmessageerror?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) =&gt; void
1449
1450回调函数。ThreadWorkerGlobalScope的onmessageerror属性表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。其中this指调用者对象本身[ThreadWorkerGlobalScope](#threadworkerglobalscope9),ev类型为[MessageEvents](#messageevents9),表示收到的Worker消息数据。
1451
1452**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1453
1454**系统能力:** SystemCapability.Utils.Lang
1455
1456**错误码:**
1457
1458以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
1459
1460| 错误码ID | 错误信息                                   |
1461| -------- | -------------------------------------------- |
1462| 401      | Parameter error. Possible causes: 1. Incorrect parameter types. |
1463| 10200004 | The Worker instance is not running.              |
1464| 10200005 | The called API is not supported in the worker thread. |
1465
1466**示例:**
1467
1468```ts
1469// main thread
1470import { worker } from '@kit.ArkTS';
1471
1472const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1473```
1474
1475```ts
1476// worker.ets
1477import { worker, MessageEvents } from '@kit.ArkTS';
1478
1479const workerPort = worker.workerPort;
1480workerPort.onmessageerror = (err: MessageEvents) => {
1481    console.log("worker.ets onmessageerror");
1482}
1483```
1484
1485
1486## WorkerEventListener<sup>9+</sup>
1487
1488事件监听类。
1489
1490### (event: Event)<sup>9+</sup>
1491
1492(event: Event): void | Promise&lt;void&gt;
1493
1494**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1495
1496**系统能力:** SystemCapability.Utils.Lang
1497
1498**参数:**
1499
1500| 参数名 | 类型            | 必填 | 说明           |
1501| ------ | --------------- | ---- | -------------- |
1502| event  | [Event](#event) | 是   | 回调的事件类。 |
1503
1504**返回值:**
1505
1506| 类型                                  | 说明                            |
1507| ------------------------------------- | ------------------------------- |
1508| void&nbsp;\|&nbsp;Promise&lt;void&gt; | 无返回值或者以Promise形式返回。 |
1509
1510**错误码:**
1511
1512以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。
1513
1514| 错误码ID | 错误信息                                   |
1515| -------- | -------------------------------------------- |
1516| 401      | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. |
1517| 10200004 | Worker instance is not running.          |
1518| 10200005 | The invoked API is not supported in workers. |
1519
1520**示例:**
1521
1522```ts
1523const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
1524workerInstance.addEventListener("alert", ()=>{
1525    console.log("alert listener callback");
1526})
1527```
1528
1529
1530## GlobalScope<sup>9+</sup>
1531
1532Worker线程自身的运行环境,GlobalScope类继承[WorkerEventTarget](#workereventtarget9)。
1533
1534### 属性
1535
1536**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1537
1538**系统能力:** SystemCapability.Utils.Lang
1539
1540| 名称 | 类型                                                         | 可读 | 可写 | 说明                                  |
1541| ---- | ------------------------------------------------------------ | ---- | ---- | ------------------------------------- |
1542| name | string                                                       | 是   | 否   | Worker的名字,new&nbsp;Worker时指定。 |
1543| self | [GlobalScope](#globalscope9)&nbsp;&amp;&nbsp;typeof&nbsp;globalThis | 是   | 否   | GlobalScope本身。                     |
1544
1545
1546### onerror<sup>9+</sup>
1547
1548onerror?: (ev: ErrorEvent) =&gt; void
1549
1550回调函数。GlobalScope的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在Worker线程中执行。其中回调函数中ev类型为[ErrorEvent](#errorevent),表示收到的异常数据。
1551
1552**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
1553
1554**系统能力:** SystemCapability.Utils.Lang
1555
1556**示例:**
1557
1558```ts
1559// main thread
1560import { worker } from '@kit.ArkTS';
1561
1562const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets")
1563```
1564
1565```ts
1566// worker.ets
1567import { worker, ErrorEvent } from '@kit.ArkTS';
1568
1569const workerPort = worker.workerPort
1570workerPort.onerror = (err: ErrorEvent) => {
1571    console.log("worker.ets onerror" + err.message)
1572}
1573```
1574
1575## MessageEvents<sup>9+</sup>
1576
1577消息类,持有Worker线程间传递的数据。
1578
1579**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。
1580
1581**系统能力:** SystemCapability.Utils.Lang
1582
1583| 名称 | 类型 | 可读 | 可写 | 说明               |
1584| ---- | ---- | ---- | ---- | ------------------ |
1585| data | any  | 是   | 否   | 线程间传递的数据。 |
1586
1587## MessageType<sup>7+</sup>
1588
1589type MessageType = 'message' | 'messageerror';
1590
1591表示消息类型。
1592
1593**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
1594
1595**系统能力:** SystemCapability.Utils.Lang
1596
1597| 类型  | 说明               |
1598| ---- | ------------------ |
1599| 'message'  | 表示消息类型为message,值固定为'message'字符串。 |
1600| 'messageerror'  | 表示消息类型为messageerror,值固定为'messageerror'字符串。 |
1601
1602## ErrorCallback<sup>18+</sup>
1603
1604type ErrorCallback = (err: ErrorEvent) => void
1605
1606表示异常回调类型。
1607
1608**原子化服务API:** 从API version 18开始,该接口支持在原子化服务中使用。
1609
1610**系统能力:** SystemCapability.Utils.Lang
1611
1612**参数:**
1613
1614| 参数名    | 类型                            | 必填 | 说明                                                         |
1615| --------- | ------------------------------- | ---- | ------------------------------------------------------------ |
1616| err | ErrorEvent                          | 是   | 错误事件类,用于表示Worker执行过程中出现异常的详细信息。 |
1617
1618## Worker<sup>(deprecated)</sup>
1619
1620使用以下方法前,均需先构造Worker实例,Worker类继承[EventTarget](#eventtargetdeprecated)。
1621
1622> **说明:**<br/>
1623> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker<sup>9+</sup>](#threadworker9)替代。
1624
1625### constructor<sup>(deprecated)</sup>
1626
1627constructor(scriptURL: string, options?: WorkerOptions)
1628
1629Worker构造函数。
1630
1631> **说明:**<br/>
1632> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.constructor<sup>9+</sup>](#constructor9)替代。
1633
1634**系统能力:** SystemCapability.Utils.Lang
1635
1636**参数:**
1637
1638| 参数名    | 类型                            | 必填 | 说明                                                         |
1639| --------- | ------------------------------- | ---- | ------------------------------------------------------------ |
1640| scriptURL | string                          | 是   | Worker线程文件的路径,路径规则详细参考[文件路径注意事项](../../arkts-utils/worker-introduction.md#文件路径注意事项)。 |
1641| options   | [WorkerOptions](#workeroptions) | 否   | Worker构造的选项。                                           |
1642
1643**示例:**
1644
1645此处以在Stage模型中Ability加载Worker文件为例,使用Library加载Worker线程文件的场景参考[文件路径注意事项](../../arkts-utils/worker-introduction.md#文件路径注意事项)。
1646
1647
1648```ts
1649import { worker } from '@kit.ArkTS';
1650
1651// 主要说明以下两种场景:
1652
1653// 场景1: worker文件所在路径:"entry/src/main/ets/workers/worker.ets"
1654const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ets', {name:"first worker in Stage model"});
1655
1656// 场景2: worker文件所在路径:"testworkers/src/main/ets/ThreadFile/workers/worker.ets"
1657const workerStageModel02 = new worker.ThreadWorker('testworkers/ets/ThreadFile/workers/worker.ets');
1658```
1659
1660### postMessage<sup>(deprecated)</sup>
1661
1662postMessage(message: Object, transfer: ArrayBuffer[]): void
1663
1664宿主线程通过转移对象所有权的方式向Worker线程发送消息。
1665
1666> **说明:**<br/>
1667> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.postMessage<sup>9+</sup>](#postmessage9)替代。
1668
1669**系统能力:** SystemCapability.Utils.Lang
1670
1671**参数:**
1672
1673| 参数名   | 类型          | 必填 | 说明                                                         |
1674| -------- | ------------- | ---- | ------------------------------------------------------------ |
1675| message  | Object        | 是   | 发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
1676| transfer | ArrayBuffer[] | 是   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用,数组不可传入null。 |
1677
1678**示例:**
1679
1680```ts
1681const workerInstance = new worker.Worker("workers/worker.ets");
1682
1683let buffer = new ArrayBuffer(8);
1684workerInstance.postMessage(buffer, [buffer]);
1685```
1686
1687### postMessage<sup>(deprecated)</sup>
1688
1689postMessage(message: Object, options?: PostMessageOptions): void
1690
1691宿主线程通过转移对象所有权或者拷贝数据的方式向Worker线程发送消息。
1692
1693> **说明:**<br/>
1694> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.postMessage<sup>9+</sup>](#postmessage9-1)替代。
1695
1696**系统能力:** SystemCapability.Utils.Lang
1697
1698**参数:**
1699
1700| 参数名  | 类型                                      | 必填 | 说明                                                         |
1701| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
1702| message | Object                                    | 是   | 发送至Worker的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
1703| options | [PostMessageOptions](#postmessageoptions) | 否   | 当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到Worker线程,在宿主线程中将会变为不可用,仅在Worker线程中可用。<br/>若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到Worker线程。 |
1704
1705**示例:**
1706
1707```ts
1708const workerInstance = new worker.Worker("workers/worker.ets");
1709
1710workerInstance.postMessage("hello world");
1711
1712let buffer = new ArrayBuffer(8);
1713workerInstance.postMessage(buffer, [buffer]);
1714```
1715
1716
1717### on<sup>(deprecated)</sup>
1718
1719on(type: string, listener: EventListener): void
1720
1721向Worker添加一个事件监听,该接口与[addEventListener<sup>(deprecated)</sup>](#addeventlistenerdeprecated)接口功能一致。
1722
1723> **说明:**<br/>
1724> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.on<sup>9+</sup>](#on9)替代。
1725
1726**系统能力:** SystemCapability.Utils.Lang
1727
1728**参数:**
1729
1730| 参数名   | 类型                                      | 必填 | 说明             |
1731| -------- | ----------------------------------------- | ---- | ---------------- |
1732| type     | string                                    | 是   | 监听的事件类型。 |
1733| listener | [EventListener](#eventlistenerdeprecated) | 是   | 回调事件。       |
1734
1735**示例:**
1736
1737```ts
1738const workerInstance = new worker.Worker("workers/worker.ets");
1739workerInstance.on("alert", ()=>{
1740    console.log("alert listener callback");
1741})
1742```
1743
1744
1745### once<sup>(deprecated)</sup>
1746
1747once(type: string, listener: EventListener): void
1748
1749向Worker添加一个事件监听,事件监听只执行一次便自动删除。
1750
1751> **说明:**<br/>
1752> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.once<sup>9+</sup>](#once9)替代。
1753
1754**系统能力:** SystemCapability.Utils.Lang
1755
1756**参数:**
1757
1758| 参数名   | 类型                                      | 必填 | 说明             |
1759| -------- | ----------------------------------------- | ---- | ---------------- |
1760| type     | string                                    | 是   | 监听的事件类型。 |
1761| listener | [EventListener](#eventlistenerdeprecated) | 是   | 回调事件。       |
1762
1763**示例:**
1764
1765```ts
1766const workerInstance = new worker.Worker("workers/worker.ets");
1767workerInstance.once("alert", ()=>{
1768    console.log("alert listener callback");
1769})
1770```
1771
1772
1773### off<sup>(deprecated)</sup>
1774
1775off(type: string, listener?: EventListener): void
1776
1777删除类型为type的事件监听,该接口与[removeEventListener<sup>(deprecated)</sup>](#removeeventlistenerdeprecated)接口功能一致。
1778
1779> **说明:**<br/>
1780> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.off<sup>9+</sup>](#off9)替代。
1781
1782**系统能力:** SystemCapability.Utils.Lang
1783
1784**参数:**
1785
1786| 参数名   | 类型                                      | 必填 | 说明                 |
1787| -------- | ----------------------------------------- | ---- | -------------------- |
1788| type     | string                                    | 是   | 需要删除的事件类型。 |
1789| listener | [EventListener](#eventlistenerdeprecated) | 否   | 删除监听事件后所执行的回调事件。 |
1790
1791**示例:**
1792
1793```ts
1794const workerInstance = new worker.Worker("workers/worker.ets");
1795//使用on接口、once接口或addEventListener接口创建“alert”事件,使用off接口删除事件。
1796workerInstance.off("alert");
1797```
1798
1799
1800### terminate<sup>(deprecated)</sup>
1801
1802terminate(): void
1803
1804销毁Worker线程,终止Worker接收消息。
1805
1806> **说明:**<br/>
1807> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.terminate<sup>9+</sup>](#terminate9)替代。
1808
1809**系统能力:** SystemCapability.Utils.Lang
1810
1811**示例:**
1812
1813```ts
1814const workerInstance = new worker.Worker("workers/worker.ets");
1815workerInstance.terminate();
1816```
1817
1818
1819### onexit<sup>(deprecated)</sup>
1820
1821onexit?: (code: number) =&gt; void
1822
1823回调函数。表示Worker销毁时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中code类型为number,异常退出为1,正常退出为0。
1824
1825> **说明:**<br/>
1826> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.onexit<sup>9+</sup>](#onexit9)替代。
1827
1828**系统能力:** SystemCapability.Utils.Lang
1829
1830**示例:**
1831
1832```ts
1833const workerInstance = new worker.Worker("workers/worker.ets");
1834workerInstance.onexit = (code) => {
1835    console.log("onexit");
1836}
1837
1838//onexit被执行两种方式:
1839//main thread:
1840workerInstance.terminate();
1841
1842//worker线程:
1843//parentPort.close()
1844```
1845
1846
1847### onerror<sup>(deprecated)</sup>
1848
1849onerror?: (err: ErrorEvent) =&gt; void
1850
1851回调函数。表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中err类型为[ErrorEvent](#errorevent),表示收到的异常数据。
1852
1853> **说明:**<br/>
1854> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.onerror<sup>9+</sup>](#onerror9)替代。
1855
1856**系统能力:** SystemCapability.Utils.Lang
1857
1858**示例:**
1859
1860```ts
1861import { worker, ErrorEvent } from '@kit.ArkTS';
1862
1863const workerInstance = new worker.Worker("workers/worker.ets");
1864workerInstance.onerror = (err: ErrorEvent) => {
1865  console.log("onerror" + err.message);
1866}
1867```
1868
1869
1870### onmessage<sup>(deprecated)</sup>
1871
1872onmessage?: (event: MessageEvent) =&gt; void
1873
1874回调函数。表示宿主线程接收到来自其创建的Worker通过workerPort.postMessage接口发送的消息时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中event类型为[MessageEvent](#messageeventt),表示收到的Worker消息数据。
1875
1876> **说明:**<br/>
1877> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.onmessage<sup>9+</sup>](#onmessage9)替代。
1878
1879**系统能力:** SystemCapability.Utils.Lang
1880
1881**示例:**
1882
1883```ts
1884import { worker } from '@kit.ArkTS';
1885
1886const workerInstance = new worker.Worker("workers/worker.ets");
1887workerInstance.onmessage = (): void => {
1888    console.log("onmessage");
1889}
1890```
1891
1892
1893### onmessageerror<sup>(deprecated)</sup>
1894
1895onmessageerror?: (event: MessageEvent) =&gt; void
1896
1897回调函数。表示当Worker对象接收到一条无法被序列化的消息时被调用的事件处理程序,处理程序在宿主线程中执行。其中回调函数中event类型为[MessageEvent](#messageeventt),表示收到的Worker消息数据。
1898
1899> **说明:**<br/>
1900> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorker.onmessageerror<sup>9+</sup>](#onmessageerror9)替代。
1901
1902**系统能力:** SystemCapability.Utils.Lang
1903
1904**示例:**
1905
1906```ts
1907import { worker } from '@kit.ArkTS';
1908
1909const workerInstance = new worker.Worker("workers/worker.ets");
1910workerInstance.onmessageerror = (err) => {
1911    console.log("onmessageerror");
1912}
1913```
1914
1915
1916## EventTarget<sup>(deprecated)</sup>
1917> **说明:**<br/>
1918> 从API version 7开始支持,从API version 9开始废弃,建议使用[WorkerEventTarget<sup>9+</sup>](#workereventtarget9)替代。
1919
1920### addEventListener<sup>(deprecated)</sup>
1921
1922addEventListener(type: string, listener: EventListener): void
1923
1924向Worker添加一个事件监听,该接口与[on<sup>(deprecated)</sup>](#ondeprecated)接口功能一致。
1925
1926> **说明:**<br/>
1927> 从API version 7开始支持,从API version 9开始废弃,建议使用[addEventListener<sup>9+</sup>](#addeventlistener9)替代。
1928
1929**系统能力:** SystemCapability.Utils.Lang
1930
1931**参数:**
1932
1933| 参数名   | 类型                                      | 必填 | 说明             |
1934| -------- | ----------------------------------------- | ---- | ---------------- |
1935| type     | string                                    | 是   | 监听的事件类型。 |
1936| listener | [EventListener](#eventlistenerdeprecated) | 是   | 回调的事件。     |
1937
1938**示例:**
1939
1940```ts
1941// worker.ets
1942import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
1943
1944const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
1945
1946workerPort.addEventListener("alert", () => {
1947  console.info("alert listener callback");
1948})
1949```
1950
1951
1952### removeEventListener<sup>(deprecated)</sup>
1953
1954removeEventListener(type: string, callback?: EventListener): void
1955
1956删除Worker的事件监听,该接口与[off<sup>(deprecated)</sup>](#offdeprecated)接口功能一致。
1957
1958> **说明:**<br/>
1959> 从API version 7开始支持,从API version 9开始废弃,建议使用[removeEventListener<sup>9+</sup>](#removeeventlistener9)替代。
1960
1961**系统能力:** SystemCapability.Utils.Lang
1962
1963**参数:**
1964
1965| 参数名   | 类型                                      | 必填 | 说明                     |
1966| -------- | ----------------------------------------- | ---- | ------------------------ |
1967| type     | string                                    | 是   | 需要删除的监听事件类型。 |
1968| callback | [EventListener](#eventlistenerdeprecated) | 否   | 删除监听事件后所执行的回调事件。 |
1969
1970**示例:**
1971
1972```ts
1973// worker.ets
1974import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
1975
1976const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
1977
1978workerPort.addEventListener("alert", () => {
1979  console.info("alert listener callback");
1980})
1981
1982workerPort.removeEventListener('alert');
1983```
1984
1985
1986### dispatchEvent<sup>(deprecated)</sup>
1987
1988dispatchEvent(event: Event): boolean
1989
1990分发定义在Worker的事件。
1991
1992> **说明:**<br/>
1993> 从API version 7开始支持,从API version 9开始废弃,建议使用[dispatchEvent<sup>9+</sup>](#dispatchevent9)替代。
1994
1995**系统能力:** SystemCapability.Utils.Lang
1996
1997**参数:**
1998
1999| 参数名 | 类型            | 必填 | 说明             |
2000| ------ | --------------- | ---- | ---------------- |
2001| event  | [Event](#event) | 是   | 需要分发的事件。 |
2002
2003**返回值:**
2004
2005| 类型    | 说明                            |
2006| ------- | ------------------------------- |
2007| boolean | 分发的结果。true表示分发成功,false表示分发失败。 |
2008
2009**示例:**
2010
2011```ts
2012// worker.ets
2013import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
2014
2015const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
2016
2017workerPort.addEventListener("alert_add", ()=>{
2018  console.info("alert listener callback");
2019})
2020
2021workerPort.dispatchEvent({type: 'alert_add', timeStamp: 0}); //timeStamp暂未支持。
2022```
2023
2024分发事件(dispatchEvent)可与监听接口(addEventListener)搭配使用,示例如下:
2025
2026```ts
2027// main thread
2028import { worker } from '@kit.ArkTS';
2029
2030const workerInstance = new worker.Worker("workers/worker.ets");
2031workerInstance.postMessage("hello world");
2032workerInstance.onmessage = (): void => {
2033    console.info("receive data from worker.ets");
2034}
2035```
2036
2037```ts
2038// worker.ets
2039import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
2040
2041const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
2042
2043workerPort.addEventListener("alert", ()=>{
2044  console.info("alert listener callback");
2045})
2046
2047workerPort.onmessage = (event: MessageEvents) => {
2048  workerPort.dispatchEvent({type:"alert", timeStamp:0}); //timeStamp暂未支持。
2049}
2050```
2051
2052### removeAllListener<sup>(deprecated)</sup>
2053
2054removeAllListener(): void
2055
2056删除Worker所有的事件监听。
2057
2058> **说明:**<br/>
2059> 从API version 7开始支持,从API version 9开始废弃,建议使用[removeAllListener<sup>9+</sup>](#removealllistener9)替代。
2060
2061**系统能力:** SystemCapability.Utils.Lang
2062
2063**示例:**
2064
2065```ts
2066// worker.ets
2067import { DedicatedWorkerGlobalScope, ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
2068
2069const workerPort: DedicatedWorkerGlobalScope = worker.parentPort;
2070
2071workerPort.addEventListener("alert_add", ()=>{
2072  console.info("alert listener callback");
2073})
2074
2075workerPort.removeAllListener();
2076```
2077
2078
2079## DedicatedWorkerGlobalScope<sup>(deprecated)</sup>
2080
2081Worker线程用于与宿主线程通信的类,通过postMessage接口发送消息给宿主线程、close接口销毁Worker线程。DedicatedWorkerGlobalScope类继承[WorkerGlobalScope](#workerglobalscopedeprecated)。
2082
2083> **说明:**<br/>
2084> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>](#threadworkerglobalscope9)替代。
2085
2086### postMessage<sup>(deprecated)</sup>
2087
2088postMessage(messageObject: Object, transfer: Transferable[]): void
2089
2090Worker线程通过转移对象所有权的方式向宿主线程发送消息。
2091
2092> **说明:**<br/>
2093> 此接口暂不支持使用,从API version 9开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.postMessage<sup>9+</sup>](#postmessage9-2)替代。
2094
2095**系统能力:** SystemCapability.Utils.Lang
2096
2097**参数:**
2098
2099| 参数名  | 类型                                      | 必填 | 说明                                                         |
2100| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
2101| messageObject | Object                                    | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
2102| transfer| Transferable[]                            | 是   | 暂不支持该参数类型。                                         |
2103
2104### postMessage<sup>(deprecated)</sup>
2105
2106postMessage(messageObject: Object, transfer: ArrayBuffer[]): void
2107
2108Worker线程通过转移对象所有权的方式向宿主线程发送消息。
2109
2110> **说明:**<br/>
2111> DedicatedWorkerGlobalScope类自API version 9开始废弃,本接口建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.postMessage<sup>9+</sup>](#postmessage9-2)替代。
2112
2113**系统能力:** SystemCapability.Utils.Lang
2114
2115**参数:**
2116
2117| 参数名   | 类型          | 必填 | 说明                                                         |
2118| -------- | ------------- | ---- | ------------------------------------------------------------ |
2119| messageObject  | Object        | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
2120| transfer | ArrayBuffer[] | 是   | 表示可转移的ArrayBuffer实例对象数组,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用,数组不可传入null。 |
2121
2122**示例:**
2123
2124```ts
2125// main thread
2126import { worker } from '@kit.ArkTS';
2127
2128const workerInstance = new worker.Worker("workers/worker.ets");
2129workerInstance.postMessage("hello world");
2130workerInstance.onmessage = (): void => {
2131    // let data = e.data;
2132    console.log("receive data from worker.ets");
2133}
2134```
2135```ts
2136// worker.ets
2137import { worker } from '@kit.ArkTS';
2138
2139const workerPort = worker.workerPort;
2140workerPort.onmessage = (): void => {
2141    // let data = e.data;
2142    let buffer = new ArrayBuffer(5)
2143    workerPort.postMessage(buffer, [buffer]);
2144}
2145```
2146
2147### postMessage<sup>(deprecated)</sup>
2148
2149postMessage(messageObject: Object, options?: PostMessageOptions): void
2150
2151Worker线程通过转移对象所有权或者拷贝数据的方式向宿主线程发送消息。
2152
2153> **说明:**<br/>
2154> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.postMessage<sup>9+</sup>](#postmessage9-3)替代。
2155
2156**系统能力:** SystemCapability.Utils.Lang
2157
2158**参数:**
2159
2160| 参数名  | 类型                                      | 必填 | 说明                                                         |
2161| ------- | ----------------------------------------- | ---- | ------------------------------------------------------------ |
2162| messageObject | Object                                    | 是   | 发送至宿主线程的数据,该数据对象必须是可序列化,序列化支持类型见[其他说明](#序列化支持类型)。 |
2163| options | [PostMessageOptions](#postmessageoptions) | 否   | 当填入该参数时,与传入ArrayBuffer[]的作用一致,该数组中对象的所有权会被转移到宿主线程,在Worker线程中将会变为不可用,仅在宿主线程中可用。<br/>若不填入该参数,默认设置为 undefined,通过拷贝数据的方式传输信息到宿主线程。 |
2164
2165**示例:**
2166
2167<!--no_check-->
2168```ts
2169// main thread
2170import { worker } from '@kit.ArkTS';
2171
2172const workerInstance = new worker.Worker("entry/ets/workers/worker.ets");
2173workerInstance.postMessage("hello world");
2174workerInstance.onmessage = (): void => {
2175    console.log("receive data from worker.ets");
2176}
2177```
2178```ts
2179// worker.ets
2180import { ErrorEvent, MessageEvents, worker } from '@kit.ArkTS';
2181
2182const parentPort = worker.parentPort;
2183parentPort.onmessage = (e: MessageEvents) => {
2184  parentPort.postMessage("receive data from main thread");
2185}
2186```
2187
2188### close<sup>(deprecated)</sup>
2189
2190close(): void
2191
2192销毁Worker线程,终止Worker接收消息。
2193
2194> **说明:**<br/>
2195> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.close<sup>9+</sup>](#close9)替代。
2196
2197**系统能力:** SystemCapability.Utils.Lang
2198
2199**示例:**
2200
2201```ts
2202// main thread
2203import { worker } from '@kit.ArkTS';
2204
2205const workerInstance = new worker.Worker("workers/worker.ets");
2206```
2207```ts
2208// worker.ets
2209import { worker } from '@kit.ArkTS';
2210
2211const parentPort = worker.parentPort;
2212parentPort.onmessage = (): void => {
2213    parentPort.close()
2214}
2215```
2216
2217
2218### onmessage<sup>(deprecated)</sup>
2219
2220onmessage?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) =&gt; void
2221
2222回调函数,DedicatedWorkerGlobalScope的onmessage属性表示Worker线程收到来自其宿主线程通过postMessage接口发送的消息时被调用的事件处理程序,处理程序在Worker线程中执行。其中this指调用者对象本身[DedicatedWorkerGlobalScope](#dedicatedworkerglobalscopedeprecated),ev类型为[MessageEvent](#messageeventt),表示收到的Worker消息数据。
2223
2224> **说明:**<br/>
2225> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.onmessage<sup>9+</sup>](#onmessage9-1)替代。
2226
2227**系统能力:** SystemCapability.Utils.Lang
2228
2229**示例:**
2230
2231```ts
2232// main thread
2233import { worker } from '@kit.ArkTS';
2234
2235const workerInstance = new worker.Worker("workers/worker.ets");
2236workerInstance.postMessage("hello world");
2237```
2238```ts
2239// worker.ets
2240import { worker } from '@kit.ArkTS';
2241
2242const parentPort = worker.parentPort;
2243parentPort.onmessage = (): void => {
2244    console.log("receive main thread message");
2245}
2246```
2247
2248
2249### onmessageerror<sup>(deprecated)</sup>
2250
2251onmessageerror?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) =&gt; void
2252
2253DedicatedWorkerGlobalScope的onmessageerror属性表示当Worker对象接收到一条无法被反序列化的消息时被调用的事件处理程序,处理程序在Worker线程中执行。其中this指调用者对象本身[DedicatedWorkerGlobalScope](#dedicatedworkerglobalscopedeprecated),ev类型为[MessageEvent](#messageeventt),表示收到的Worker消息数据。
2254
2255> **说明:**<br/>
2256> 从API version 7开始支持,从API version 9开始废弃,建议使用[ThreadWorkerGlobalScope<sup>9+</sup>.onmessageerror<sup>9+</sup>](#onmessageerror9-1)替代。
2257
2258**系统能力:** SystemCapability.Utils.Lang
2259
2260**示例:**
2261
2262```ts
2263// main thread
2264import { worker } from '@kit.ArkTS';
2265
2266const workerInstance = new worker.Worker("workers/worker.ets");
2267```
2268```ts
2269// worker.ets
2270import { worker } from '@kit.ArkTS';
2271
2272const parentPort = worker.parentPort;
2273parentPort.onmessageerror = () => {
2274    console.log("worker.ets onmessageerror")
2275}
2276```
2277
2278
2279## PostMessageOptions
2280
2281明确数据传递过程中需要转移所有权对象的类,传递所有权的对象必须是ArrayBuffer,发送它的上下文中将会变为不可用,仅在接收方可用。
2282
2283**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。
2284
2285**系统能力:** SystemCapability.Utils.Lang
2286
2287| 名称     | 类型     | 可读 | 可写 | 说明                              |
2288| -------- | -------- | ---- | ---- | --------------------------------- |
2289| transfer | Object[] | 是   | 是   | ArrayBuffer数组,用于传递所有权。该数组中不可传入null。 |
2290
2291
2292## Event
2293
2294事件类。
2295
2296**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2297
2298**系统能力:** SystemCapability.Utils.Lang
2299
2300| 名称      | 类型   | 可读 | 可写 | 说明                                         |
2301| --------- | ------ | ---- | ---- | -------------------------------------------- |
2302| type      | string | 是   | 否   | 指定事件的类型。                             |
2303| timeStamp | number | 是   | 否   | 事件创建时的时间戳(精度为毫秒),暂未支持。 |
2304
2305
2306## EventListener<sup>(deprecated)</sup>
2307
2308事件监听类。
2309
2310> **说明:**
2311>
2312> 从API version 7开始支持,从API version 9开始废弃,建议使用[WorkerEventListener<sup>9+</sup>](#workereventlistener9)替代。
2313
2314### (evt: Event)<sup>(deprecated)</sup>
2315
2316(evt: Event): void | Promise&lt;void&gt;
2317
2318> **说明:**
2319>
2320> 从API version 7开始支持,从API version 9开始废弃,建议使用[(event:Event)<sup>9+</sup>](#event-event9)替代。
2321
2322**系统能力:** SystemCapability.Utils.Lang
2323
2324**参数:**
2325
2326| 参数名 | 类型            | 必填 | 说明           |
2327| ------ | --------------- | ---- | -------------- |
2328| evt    | [Event](#event) | 是   | 回调的事件类。 |
2329
2330**返回值:**
2331
2332| 类型                                  | 说明                            |
2333| ------------------------------------- | ------------------------------- |
2334| void&nbsp;\|&nbsp;Promise&lt;void&gt; | 无返回值或者以Promise形式返回。 |
2335
2336**示例:**
2337
2338```ts
2339const workerInstance = new worker.Worker("workers/worker.ets");
2340workerInstance.addEventListener("alert", ()=>{
2341    console.log("alert listener callback");
2342})
2343```
2344
2345
2346## ErrorEvent
2347
2348错误事件类,用于表示Worker执行过程中出现异常的详细信息,ErrorEvent类继承[Event](#event)。
2349
2350**原子化服务API**:从API version 11开始,该接口支持在原子化服务中使用。
2351
2352**系统能力:** SystemCapability.Utils.Lang
2353
2354| 名称     | 类型   | 可读 | 可写 | 说明                 |
2355| -------- | ------ | ---- | ---- | -------------------- |
2356| message  | string | 是   | 否   | 异常发生的错误信息。 |
2357| filename | string | 是   | 否   | 出现异常所在的文件。 |
2358| lineno   | number | 是   | 否   | 异常所在的行数。     |
2359| colno    | number | 是   | 否   | 异常所在的列数。     |
2360| error    | Object | 是   | 否   | 异常类型。           |
2361
2362
2363## MessageEvent\<T\>
2364
2365消息类,持有Worker线程间传递的数据。
2366
2367**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。
2368
2369**系统能力:** SystemCapability.Utils.Lang
2370
2371| 名称 | 类型 | 可读 | 可写 | 说明               |
2372| ---- | ---- | ---- | ---- | ------------------ |
2373| data | T    | 是   | 否   | 线程间传递的数据。 |
2374
2375
2376## WorkerGlobalScope<sup>(deprecated)</sup>
2377
2378Worker线程自身的运行环境,WorkerGlobalScope类继承[EventTarget](#eventtargetdeprecated)。
2379
2380> **说明:**<br/>
2381> 从API version 7开始支持,从API version 9开始废弃,建议使用[GlobalScope<sup>9+</sup>](#globalscope9)替代。
2382
2383### 属性
2384
2385**系统能力:** SystemCapability.Utils.Lang
2386
2387| 名称 | 类型                                                         | 可读 | 可写 | 说明                                  |
2388| ---- | ------------------------------------------------------------ | ---- | ---- | ------------------------------------- |
2389| name | string                                                       | 是   | 否   | Worker的名字,new&nbsp;Worker时指定。 |
2390| self | [WorkerGlobalScope](#workerglobalscopedeprecated)&nbsp;&amp;&nbsp;typeof&nbsp;globalThis | 是   | 否   | WorkerGlobalScope本身。               |
2391
2392
2393### onerror<sup>(deprecated)</sup>
2394
2395onerror?: (ev: ErrorEvent) =&gt; void
2396
2397WorkerGlobalScope的onerror属性表示Worker在执行过程中发生异常被调用的事件处理程序,处理程序在Worker线程中执行。其中回调函数中ev类型为[ErrorEvent](#errorevent),表示收到的异常数据。
2398
2399> **说明:**<br/>
2400> 从API version 7开始支持,从API version 9开始废弃,建议使用[GlobalScope<sup>9+</sup>.onerror<sup>9+</sup>](#onerror9-1)替代。
2401
2402**系统能力:** SystemCapability.Utils.Lang
2403
2404**示例:**
2405
2406```ts
2407// main thread
2408import { worker } from '@kit.ArkTS';
2409
2410const workerInstance = new worker.Worker("workers/worker.ets")
2411```
2412```ts
2413// worker.ets
2414import { worker, ErrorEvent } from '@kit.ArkTS';
2415
2416const parentPort = worker.parentPort
2417parentPort.onerror = (err: ErrorEvent) => {
2418    console.log("worker.ets onerror" + err.message)
2419}
2420```
2421
2422
2423## 其他说明
2424
2425### 序列化支持类型
2426
2427序列化支持类型包括:除Symbol之外的基础类型、Date、String、RegExp、Array、Map、Set、Object(仅限简单对象,比如通过"{}"或者"new Object"创建,普通对象仅支持传递属性,不支持传递其原型及方法)、ArrayBuffer、TypedArray。
2428
2429特例:传递通过自定义class创建出来的object时,不会发生序列化错误,但是自定义class的属性(如Function)无法通过序列化传递。
2430> **说明:**<br/>
2431> 以API version 9的FA工程为例。
2432
2433```ts
2434// main thread
2435import { worker, MessageEvents } from '@kit.ArkTS';
2436
2437const workerInstance = new worker.ThreadWorker("workers/worker.ets");
2438workerInstance.postMessage("message from main thread to worker");
2439workerInstance.onmessage = (d: MessageEvents): void => {
2440  // 当worker线程传递obj2时,data即为obj2。data没有Init、SetName的方法
2441  let data: string  = d.data;
2442}
2443```
2444```ts
2445// worker.ets
2446import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
2447
2448const workerPort = worker.workerPort;
2449class MyModel {
2450    name = "undefined"
2451    Init() {
2452        this.name = "MyModel"
2453    }
2454}
2455workerPort.onmessage = (d: MessageEvents): void => {
2456  console.log("worker.ets onmessage");
2457  let data: string = d.data;
2458  let func1 = () => {
2459    console.log("post message is function");
2460  }
2461  // workerPort.postMessage(func1); 传递func1发生序列化错误
2462  let obj2 = new MyModel();
2463  workerPort.postMessage(obj2);     // 传递obj2不会发生序列化错误
2464}
2465workerPort.onmessageerror = () => {
2466    console.log("worker.ets onmessageerror");
2467}
2468workerPort.onerror = (err: ErrorEvent) => {
2469    console.log("worker.ets onerror" + err.message);
2470}
2471```
2472
2473### 内存模型
2474Worker基于Actor并发模型实现。在Worker的交互流程中,JS宿主线程可以创建多个Worker子线程,各个Worker线程间相互隔离,并通过序列化传递对象,等到Worker线程完成计算任务,再把结果返回给宿主线程。
2475
2476Actor并发模型的交互原理:各个Actor并发地处理宿主线程任务,每个Actor内部都有一个消息队列和单线程执行模块。消息队列负责接收宿主线程及其他Actor的请求,而单线程执行模块则负责串行地处理这些请求、向其他Actor发送请求以及创建新的Actor。由于Actor采用的是异步方式,各个Actor之间相互隔离且没有数据竞争,因此Actor可以高并发运行。
2477
2478## 完整示例
2479> **说明:**<br/>
2480> API version 8及之前的版本仅支持FA模型,如需使用,注意更换构造Worker的接口和创建Worker线程中与宿主线程通信的对象的两个方法。<br>
2481### FA模型
2482> 此处以API version 9的工程为例。
2483
2484```ts
2485// main thread(同级目录为例)
2486import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
2487
2488// 宿主线程中创建Worker对象
2489const workerInstance = new worker.ThreadWorker("workers/worker.ets");
2490
2491// 宿主线程向worker线程传递信息
2492const buffer = new ArrayBuffer(8);
2493workerInstance.postMessage(buffer, [buffer]);
2494
2495// 宿主线程接收worker线程信息
2496workerInstance.onmessage = (e: MessageEvents): void => {
2497    // data:worker线程发送的信息
2498    let data: string = e.data;
2499    console.log("main thread onmessage");
2500
2501    // 销毁Worker对象
2502    workerInstance.terminate();
2503}
2504
2505// 在调用terminate后,执行回调onexit
2506workerInstance.onexit = (code) => {
2507    console.log("main thread terminate");
2508}
2509
2510workerInstance.onerror = (err: ErrorEvent) => {
2511    console.log("main error message " + err.message);
2512}
2513```
2514```ts
2515// worker.ets
2516import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
2517
2518// 创建worker线程中与宿主线程通信的对象
2519const workerPort = worker.workerPort
2520
2521// worker线程接收宿主线程信息
2522workerPort.onmessage = (e: MessageEvents): void => {
2523    // data:宿主线程发送的信息
2524    let data: number = e.data;
2525    const view = new Int8Array(data).fill(3);
2526    console.log("worker.ets onmessage");
2527
2528    // worker线程向宿主线程发送信息
2529    workerPort.postMessage(view);
2530}
2531
2532// worker线程发生error的回调
2533workerPort.onerror = (err: ErrorEvent) => {
2534    console.log("worker.ets onerror");
2535}
2536```
2537在模块级entry/build-profile.json5配置文件添加如下配置:
2538```json
2539  "buildOption": {
2540    "sourceOption": {
2541      "workers": [
2542        "./src/main/ets/entryability/workers/worker.ets"
2543      ]
2544    }
2545  }
2546```
2547### Stage模型
2548> 此处以API version 18的工程为例。
2549```ts
2550// Index.ets
2551import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
2552
2553@Entry
2554@Component
2555struct Index {
2556  @State message: string = 'Hello World';
2557  build() {
2558    Row() {
2559      Column() {
2560        Text(this.message)
2561          .fontSize(50)
2562          .fontWeight(FontWeight.Bold)
2563          .onClick(() => {
2564            // 宿主线程中创建Worker对象
2565            const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
2566            // 宿主线程向worker线程传递信息
2567            const buffer = new ArrayBuffer(8);
2568            workerInstance.postMessage(buffer);
2569            // 宿主线程接收worker线程信息
2570            workerInstance.onmessage = (e: MessageEvents): void => {
2571              // data:worker线程发送的信息
2572              let data: number = e.data;
2573              console.info("main thread data is  " + data);
2574              // 销毁Worker对象
2575              workerInstance.terminate();
2576            }
2577            // 在调用terminate后,执行onexit
2578            workerInstance.onexit = (code) => {
2579              console.log("main thread terminate");
2580            }
2581
2582            workerInstance.onAllErrors = (err: ErrorEvent) => {
2583              console.log("main error message " + err.message);
2584            }
2585          })
2586      }
2587      .width('100%')
2588      .height('100%')
2589    }
2590  }
2591}
2592```
2593```ts
2594// Worker.ets
2595import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
2596
2597// 创建worker线程中与宿主线程通信的对象
2598const workerPort = worker.workerPort
2599
2600// worker线程接收宿主线程信息
2601workerPort.onmessage = (e: MessageEvents): void => {
2602  // data:宿主线程发送的信息
2603  let data: number = e.data;
2604  // 往收到的buffer里写入数据
2605  const view = new Int8Array(data).fill(3);
2606  // worker线程向宿主线程发送信息
2607  workerPort.postMessage(view);
2608}
2609
2610// worker线程发生error的回调
2611workerPort.onerror = (err: ErrorEvent) => {
2612  console.log("worker.ets onerror" + err.message);
2613}
2614```
2615在模块级entry/build-profile.json5配置文件添加如下配置:
2616```json
2617  "buildOption": {
2618    "sourceOption": {
2619      "workers": [
2620        "./src/main/ets/workers/Worker.ets"
2621      ]
2622    }
2623  }
2624```
2625<!--no_check-->
2626