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