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