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) => 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) => 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) => 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) => 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) => 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) => 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<void> 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 \| Promise<void> | 无返回值或者以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 Worker时指定。 | 1494| self | [GlobalScope](#globalscope9) & typeof globalThis | 是 | 否 | GlobalScope本身。 | 1495 1496 1497### onerror<sup>9+</sup> 1498 1499onerror?: (ev: ErrorEvent) => 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) => 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) => 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) => 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) => 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) => 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) => 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<void> 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 \| Promise<void> | 无返回值或者以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 Worker时指定。 | 2325| self | [WorkerGlobalScope](#workerglobalscopedeprecated) & typeof globalThis | 是 | 否 | WorkerGlobalScope本身。 | 2326 2327 2328### onerror<sup>(deprecated)</sup> 2329 2330onerror?: (ev: ErrorEvent) => 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