@ohos.worker (Starting the Worker)

The worker thread is an independent thread running in parallel with the main thread. The thread that creates the worker thread is referred to as the host thread. The URL file passed in during worker creation is executed in the worker thread. The worker thread can process time-consuming operations, but cannot directly operate the UI.

With the Worker module, you can provide a multithreading environment for an application, so that the application can perform a time-consuming operation in a background thread. This greatly prevents a computing-intensive or high-latency task from blocking the running of the main thread. A Worker instance will not be proactively destroyed once it is created. It consumes resources to keep running. Therefore, you should call the API to terminate it in a timely manner.

The Context object of the worker thread is different from that of the main thread. The worker thread does not support UI operations.

For details about the precautions for using Worker, see Precautions for Worker.

NOTE

The initial APIs of this module are supported since API version 7. Newly added APIs will be marked with a superscript to indicate their earliest API version.

Modules to Import

import worker from '@ohos.worker';

Attributes

System capability: SystemCapability.Utils.Lang

Name Type Readable Writable Description
workerPort9+ ThreadWorkerGlobalScope Yes Yes Object of the worker thread used to communicate with the host thread.
parentPort(deprecated) DedicatedWorkerGlobalScope Yes Yes Object of the worker thread used to communicate with the host thread.
This attribute is supported since API version 7 and deprecated since API version 9.
You are advised to use workerPort9+ instead.

WorkerOptions

Provides options that can be set for the Worker instance to create.

System capability: SystemCapability.Utils.Lang

Name Type Read-only Mandatory Description
type "classic" | "module" Yes No Mode in which the Worker instance executes the script. The module type is not supported yet. The default value is classic.
name string Yes No Name of the worker thread. The default value is undefined.
shared boolean Yes No Whether sharing of the Worker instance is enabled. Currently, sharing is not supported.

ThreadWorker9+

Before using the following APIs, you must create a ThreadWorker instance. The ThreadWorker class inherits from WorkerEventTarget.

constructor9+

constructor(scriptURL: string, options?: WorkerOptions)

A constructor used to create a ThreadWorker instance.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
scriptURL string Yes URL of the worker thread file.
For details about the rules, see Precautions for File URLs.
options WorkerOptions No Options that can be set for the Worker instance.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200003 Worker initialization failure.
10200007 The worker file patch is invalid path.

Example

The following code snippet shows how to load the worker thread file of the ability in the stage model. For details about how to use the library to load the worker thread file, see Precautions for File URLs.

import worker from '@ohos.worker';

// Two scenarios are involved.

// Scenario 1: URL of the worker thread file: "entry/src/main/ets/workers/worker.ets"
const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ets', {name:"first worker in Stage model"});

// Scenario 2: URL of the worker thread file: "phone/src/main/ets/ThreadFile/workers/worker.ets"
const workerStageModel02 = new worker.ThreadWorker('phone/ets/ThreadFile/workers/worker.ets');

postMessage9+

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

Used by the host thread to send a message to the worker thread by transferring object ownership.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Data to be sent to the worker thread. The data object must be sequenceable. For details about the supported parameter types, see Sequenceable Data Types.
transfer ArrayBuffer[] Yes ArrayBuffer instance holding an array of objects for which the ownership is transferred to the worker thread. After the transfer, the objects are available only in the worker thread. The array cannot be null.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200006 An exception occurred during serialization.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");

let buffer = new ArrayBuffer(8);
workerInstance.postMessage(buffer, [buffer]);

postMessage9+

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

Used by the host thread to send a message to the worker thread by transferring object ownership or copying data.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Data to be sent to the worker thread. The data object must be sequenceable. For details about the supported parameter types, see Sequenceable Data Types.
options PostMessageOptions No If this parameter is specified, it functions the same as ArrayBuffer[]. Specifically, the ownership of the objects in the array is transferred to the worker thread and becomes unavailable in the host thread. The objects are available only in the worker thread.
If this parameter is not specified, the default value undefined is used, and information is transferred to the worker thread by copying data.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200006 An exception occurred during serialization.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");

workerInstance.postMessage("hello world");

let buffer = new ArrayBuffer(8);
workerInstance.postMessage(buffer, [buffer]);

on9+

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

Adds an event listener for the worker thread. This API provides the same functionality as addEventListener9+.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event to listen for.
listener WorkerEventListener Yes Callback to invoke when an event of the specified type occurs.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.on("alert", (e)=>{
    console.log("alert listener callback");
})

once9+

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

Adds an event listener for the worker thread and removes the event listener after it is invoked once.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event to listen for.
listener WorkerEventListener Yes Callback to invoke when an event of the specified type occurs.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.once("alert", (e)=>{
    console.log("alert listener callback");
})

off9+

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

Removes an event listener for the worker thread. This API provides the same functionality as removeEventListener9+.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event for which the event listener is to be removed.
listener WorkerEventListener No Callback to invoke when the listener is removed.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
// Use on, once, or addEventListener to add a listener for the "alert" event, and use off to remove the listener.
workerInstance.off("alert");

registerGlobalCallObject11+

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

Registers an object with the ThreadWorker instance of the host thread. In this way, the methods of the object can be called in the worker thread through callGlobalCallObjectMethod.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
instanceName string Yes Key used for registration, based on which the registered object is identified during method calling.
globalCallObject Object Yes Object to register. The ThreadWorker instance holds a strong reference to the object.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
class TestObj {
  private message : string = "this is a message from TestObj"
  public getMessage() : string {
    return this.message;
  }
  public getMessageWithInput(str : string) : string {
    return this.message + " with input: " + str;
  }
}
let registerObj = new TestObj();
// Register registerObj with the ThreadWorker instance.
workerInstance.registerGlobalCallObject("myObj", registerObj);
workerInstance.postMessage("start worker")

unregisterGlobalCallObject11+

unregisterGlobalCallObject(instanceName?: string): void

Unregisters an object with the ThreadWorker instance of the host thread. This API releases the strong reference between the ThreadWorker instance and the target object. No error is reported if no object is matched.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
instanceName string No Key used for registration. If this parameter is left blank, all registered objects registered in the ThreadWorker instance are unregistered.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
class TestObj {
  private message : string = "this is a message from TestObj"
  public getMessage() : string {
    return this.message;
  }
  public getMessageWithInput(str : string) : string {
    return this.message + " with input: " + str;
  }
}
let registerObj = new TestObj();
workerInstance.registerGlobalCallObject("myObj", registerObj);
// Unregister the object.
workerInstance.unregisterGlobalCallObject("myObj");
// Unregister all objects from the ThreadWorker instance.
//workerInstance.unregisterGlobalCallObject();
workerInstance.postMessage("start worker")

terminate9+

terminate(): void

Terminates the worker thread to stop it from receiving messages.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.terminate();

onexit9+

onexit?: (code: number) => void

Called when the worker thread exits. The event handler is executed in the host thread. In the callback function, the code value is of the number type, where the value 1 indicates abnormal exit and 0 indicates normal exit.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.onexit = (code) => {
 console.log("onexit");
}

// onexit is executed in either of the following ways:
// Main thread
workerInstance.terminate();

// Worker thread
//workerPort.close()

onerror9+

onerror?: (err: ErrorEvent) => void

Called when an exception occurs during worker execution. The event handler is executed in the host thread. In the callback function, the err type is ErrorEvent, indicating the received abnormal data.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

import worker, { ErrorEvent } from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.onerror = (err: ErrorEvent) => {
  console.log("onerror" + err.message);
}

onmessage9+

onmessage?: (event: MessageEvents) => void

Called when the host thread receives a message sent by the worker thread through workerPort.postMessage. The event handler is executed in the host thread. In the callback function, the event type is MessageEvents, indicating the received message data.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

import worker, { MessageEvents } from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.onmessage = (e: MessageEvents): void => {
 // e: MessageEvents. The usage is as follows:
 // let data = e.data;
 console.log("onmessage");
}

onmessageerror9+

onmessageerror?: (event: MessageEvents) => void

Called when the worker thread receives a message that cannot be serialized. The event handler is executed in the host thread. In the callback function, the event type is MessageEvents, indicating the received message data.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

import worker, { MessageEvents } from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.onmessageerror = (err: MessageEvents) => {
  console.log("onmessageerror");
}

addEventListener9+

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

Adds an event listener for the worker thread. This API provides the same functionality as on9+.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event to listen for.
listener WorkerEventListener Yes Callback to invoke when an event of the specified type occurs.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})

removeEventListener9+

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

Removes an event listener for the worker thread. This API provides the same functionality as off9+.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event for which the event listener is to be removed.
callback WorkerEventListener No Callback to invoke when the listener is removed.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeEventListener("alert");

dispatchEvent9+

dispatchEvent(event: Event): boolean

Dispatches the event defined for the worker thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
event Event Yes Event to dispatch.

Return value

Type Description
boolean Returns true if the event is dispatched; returns false otherwise.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");

workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); // timeStamp is not supported yet.

The dispatchEvent API can be used together with the on, once, and addEventListener APIs. The sample code is as follows:

import worker, { MessageEvents } from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");

// Usage 1:
workerInstance.on("alert_on", (e)=>{
    console.log("alert listener callback");
})
workerInstance.once("alert_once", (e)=>{
    console.log("alert listener callback");
})
workerInstance.addEventListener("alert_add", (e)=>{
    console.log("alert listener callback");
})

// The event listener created by once is removed after being executed once.
workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});// timeStamp is not supported yet.
// The event listener created by on will not be proactively deleted.
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
// The event listener created by addEventListener will not be proactively deleted.
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});

// Usage 2:
// The event type can be customized, and the special types "message", "messageerror", and "error" exist.
// When type = "message", the event handler defined by onmessage will also be executed.
// When type = "messageerror", the event handler defined by onmessageerror will also be executed.
// When type = "error", the event handler defined by onerror will also be executed.
// removeEventListener or off can be used to remove an event listener that is created by addEventListener, on, or once.

workerInstance.addEventListener("message", (e)=>{
    console.log("message listener callback");
})
workerInstance.onmessage = (e: MessageEvents): void => {
    console.log("onmessage : message listener callback");
}
// When dispatchEvent is called to distribute the "message" event, the callback passed in addEventListener and onmessage will be invoked.
workerInstance.dispatchEvent({type:"message", timeStamp:0});

removeAllListener9+

removeAllListener(): void

Removes all event listeners for the worker thread.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeAllListener();

WorkerEventTarget9+

Processes worker listening events.

addEventListener9+

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

Adds an event listener for the worker thread. This API provides the same functionality as on9+.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event to listen for.
listener WorkerEventListener Yes Callback to invoke when an event of the specified type occurs.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})

removeEventListener9+

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

Removes an event listener for the worker thread. This API provides the same functionality as off9+.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event for which the event listener is to be removed.
callback WorkerEventListener No Callback to invoke when the listener is removed.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeEventListener("alert");

dispatchEvent9+

dispatchEvent(event: Event): boolean

Dispatches the event defined for the worker thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
event Event Yes Event to dispatch.

Return value

Type Description
boolean Returns true if the event is dispatched successfully; returns false otherwise.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");

workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); // timeStamp is not supported yet.

The dispatchEvent API can be used together with the on, once, and addEventListener APIs. The sample code is as follows:

import worker, { MessageEvents } from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");

// Usage 1:
workerInstance.on("alert_on", (e)=>{
    console.log("alert listener callback");
})
workerInstance.once("alert_once", (e)=>{
    console.log("alert listener callback");
})
workerInstance.addEventListener("alert_add", (e)=>{
    console.log("alert listener callback");
})

// The event listener created by once is removed after being executed once.
workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});// timeStamp is not supported yet.
// The event listener created by on will not be proactively deleted.
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
// The event listener created by addEventListener will not be proactively deleted.
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});

// Usage 2:
// The event type can be customized, and the special types "message", "messageerror", and "error" exist.
// When type = "message", the event handler defined by onmessage will also be executed.
// When type = "messageerror", the event handler defined by onmessageerror will also be executed.
// When type = "error", the event handler defined by onerror will also be executed.
// removeEventListener or off can be used to remove an event listener that is created by addEventListener, on, or once.

workerInstance.addEventListener("message", (e)=>{
    console.log("message listener callback");
})
workerInstance.onmessage = (e: MessageEvents): void => {
    console.log("onmessage : message listener callback");
}
// When dispatchEvent is called to distribute the "message" event, the callback passed in addEventListener and onmessage will be invoked.
workerInstance.dispatchEvent({type:"message", timeStamp:0});

removeAllListener9+

removeAllListener(): void

Removes all event listeners for the worker thread.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeAllListener();

ThreadWorkerGlobalScope9+

Implements communication between the worker thread and the host thread. The postMessage API is used to send messages to the host thread, and the close API is used to terminate the worker thread. The ThreadWorkerGlobalScope class inherits from GlobalScope9+.

postMessage9+

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

Used by the worker thread to send a message to the host thread by transferring object ownership.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
messageObject Object Yes Data to be sent to the host thread. The data object must be sequenceable. For details about the supported parameter types, see Sequenceable Data Types.
transfer ArrayBuffer[] Yes ArrayBuffer instance holding an array of objects for which the ownership is transferred to the host thread. After the transfer, the objects are available only in the host thread. The array cannot be null.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200006 An exception occurred during serialization.

Example

// Main thread
import worker, { MessageEvents } from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.postMessage("hello world");
workerInstance.onmessage = (e: MessageEvents): void => {
    console.log("receive data from worker.ets");
}
// worker.ets
import worker, { MessageEvents } from '@ohos.worker';

const workerPort = worker.workerPort;
workerPort.onmessage = (e: MessageEvents): void => {
    let buffer = new ArrayBuffer(8);
    workerPort.postMessage(buffer, [buffer]);
}

postMessage9+

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

Used by the worker thread to send a message to the host thread by transferring object ownership or copying data.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
messageObject Object Yes Data to be sent to the host thread. The data object must be sequenceable. For details about the supported parameter types, see Sequenceable Data Types.
options PostMessageOptions No If this parameter is specified, it functions the same as ArrayBuffer[]. Specifically, the ownership of the objects in the array is transferred to the host thread and becomes unavailable in the worker thread. The objects are available only in the host thread.
If this parameter is not specified, the default value undefined is used, and information is transferred to the host thread by copying data.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200006 An exception occurred during serialization.

Example

// Main thread
import worker, { MessageEvents } from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.postMessage("hello world");
workerInstance.onmessage = (e: MessageEvents): void => {
    console.log("receive data from worker.ets");
}
// worker.ets
import worker, { MessageEvents } from '@ohos.worker';

const workerPort = worker.workerPort;
workerPort.onmessage = (e: MessageEvents): void => {
    workerPort.postMessage("receive data from main thread");
}

callGlobalCallObjectMethod11+

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

Calls a method of an object registered with the host thread. This API is called by the worker thread. The invoking is synchronous for the worker thread and asynchronous for the host thread. The return value is transferred through serialization.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
instanceName string Yes Key used for registration. It is used to search for the object in the host thread.
methodName string Yes Name of the method to call. Note that the method cannot be modified by async or generator, or return results asynchronously by using the asynchronous mechanism at the bottom layer. Otherwise, an exception is thrown.
timeout number Yes Maximum duration that the current synchronous invoking waits, in ms. The value is an integer ranging from 1 to 5000. The value 0 means that the 5000 ms duration is used.
args Object[] No Array of parameters in the method.

Return value

Type Description
Object Return value of the method in the host thread. The return value must be serializable. For details, see Sequenceable Data Types.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200006 An exception occurred during serialization.
10200019 The globalCallObject is not registered.
10200020 The method to be called is not callable or is an async method or a generator.
10200021 The global call exceeds the timeout.

Example

// worker.ets
import worker, { MessageEvents } from '@ohos.worker';

const workerPort = worker.workerPort;
workerPort.onmessage = (e: MessageEvents): void => {
  try {
    // The method to call does not carry an input parameter.
    let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessage", 0) as string;
    console.info("worker:", res) // worker: this is a message from TestObj
  } catch (error) {
    // Exception handling.
    console.error("worker: error code is " + error.code + " error message is " + error.message);
  }
  try {
    // The method to call carries input parameters.
    let res : string = workerPort.callGlobalCallObjectMethod("myObj", "getMessageWithInput", 0, "hello there!") as string;
    console.info("worker:", res) //worker: this is a message from TestObj with input: hello there!
  } catch (error) {
    // Exception handling.
    console.error("worker: error code is " + error.code + " error message is " + error.message);
  }
}

close9+

close(): void

Terminates the worker thread to stop it from receiving messages.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
// worker.ets
import worker, { MessageEvents } from '@ohos.worker';

const workerPort = worker.workerPort;
workerPort.onmessage = (e: MessageEvents): void => {
    workerPort.close()
}

onmessage9+

onmessage?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void

Called when the worker thread receives a message sent by the host thread through postMessage. The event handler is executed in the worker thread. In the callback function, this indicates the caller's ThreadWorkerGlobalScope, and the ev type is MessageEvents, indicating the received message data.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.postMessage("hello world");
// worker.ets
import worker, { MessageEvents } from '@ohos.worker';

const workerPort = worker.workerPort;
workerPort.onmessage = (e: MessageEvents): void => {
    console.log("receive main thread message");
}

onmessageerror9+

onmessageerror?: (this: ThreadWorkerGlobalScope, ev: MessageEvents) => void

Called when the worker thread receives a message that cannot be deserialized. The event handler is executed in the worker thread. In the callback function, this indicates the caller's ThreadWorkerGlobalScope, and the ev type is MessageEvents, indicating the received message data.

System capability: SystemCapability.Utils.Lang

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
// worker.ets
import worker, { MessageEvents } from '@ohos.worker';

const workerPort = worker.workerPort;
workerPort.onmessageerror = (err: MessageEvents) => {
    console.log("worker.ets onmessageerror");
}

WorkerEventListener9+

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

Implements event listening.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
event Event Yes Event class for the callback to invoke.

Return value

Type Description
void | Promise<void> Returns no value or returns a Promise.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200004 Worker instance is not running.
10200005 The invoked API is not supported in workers.

Example

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})

GlobalScope9+

Implements the running environment of the worker thread. The GlobalScope class inherits from WorkerEventTarget.

Attributes

System capability: SystemCapability.Utils.Lang

Name Type Readable Writable Description
name string Yes No Worker instance specified when there is a new Worker instance.
self GlobalScope & typeof globalThis Yes No GlobalScope itself.

onerror9+

onerror?: (ev: ErrorEvent) => void

Called when an exception occurs during worker execution. The event handler is executed in the worker thread. In the callback function, the ev type is ErrorEvent, indicating the received abnormal data.

System capability: SystemCapability.Utils.Lang

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ets")
// worker.ets
import worker, { ErrorEvent } from '@ohos.worker';

const workerPort = worker.workerPort
workerPort.onerror = (err: ErrorEvent) => {
    console.log("worker.ets onerror" + err.message)
}

MessageEvents9+

Holds the data transferred between worker threads.

System capability: SystemCapability.Utils.Lang

Name Type Readable Writable Description
data any Yes No Data transferred between threads.

RestrictedWorker11+

The RestrictedWorker class inherits ThreadWorker9+ and supports all APIs in ThreadWorker. RestrictedWorker provides a restricted environment for running the worker thread. In this environment, only the Worker module can be imported.

constructor11+

constructor(scriptURL: string, options?: WorkerOptions)

A constructor used to create a RestrictedWorker instance. Before using the following APIs, you must create a RestrictedWorker instance.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
scriptURL string Yes URL of the worker thread file. For details about the rules, see Precautions for File URLs.
options WorkerOptions No Options that can be set for the RestrictedWorker instance.

Error codes

For details about the error codes, see Utils Error Codes.

ID Error Message
10200003 Worker initialization failure.
10200007 The worker file patch is invalid path.

Example

The following code snippet shows how to load the worker thread file of the ability in the stage model. For details about how to use the library to load the worker thread file, see Precautions for File URLs.

Only the Worker module can be imported to the restricted worker thread file. Other APIs cannot be imported. The following is sample code:

import worker from '@ohos.worker';

// Two scenarios are involved.

// Scenario 1: URL of the worker thread file: "entry/src/main/ets/workers/worker.ets"
const workerStageModel01 = new worker.RestrictedWorker('entry/ets/workers/worker.ets', {name:"first worker in Stage model"});

// Scenario 2: URL of the worker thread file: "phone/src/main/ets/ThreadFile/workers/worker.ets"
const workerStageModel02 = new worker.RestrictedWorker('phone/ets/ThreadFile/workers/worker.ets');
// Restricted worker thread file
import worker, { MessageEvents } from '@ohos.worker';

// import process from '@ohos.process'; // Only worker APIs can be imported to the restricted worker thread file.

const workerPort = worker.workerPort;

workerPort.onmessage = (e : MessageEvents) : void => {
  console.info("worker:: This is worker thread.")
  // console.info("worker:: worker tid: "+ process.tid) // Run process.tid. The main thread reports the corresponding error.
}

Worker(deprecated)

Before using the following APIs, you must create a Worker instance. The Worker class inherits from EventTarget.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker9+ instead.

constructor(deprecated)

constructor(scriptURL: string, options?: WorkerOptions)

A constructor used to create a Worker instance.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.constructor9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
scriptURL string Yes URL of the worker thread file. For details about the rules, see Precautions for File URLs.
options WorkerOptions No Options that can be set for the Worker instance.

Example

The following code snippet shows how to load the worker thread file of the ability in the stage model. For details about how to use the library to load the worker thread file, see Precautions for File URLs.

import worker from '@ohos.worker';

// Two scenarios are involved.

// Scenario 1: URL of the worker thread file: "entry/src/main/ets/workers/worker.ets"
const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ets', {name:"first worker in Stage model"});

// Scenario 2: URL of the worker thread file: "phone/src/main/ets/ThreadFile/workers/worker.ets"
const workerStageModel02 = new worker.ThreadWorker('phone/ets/ThreadFile/workers/worker.ets');

postMessage(deprecated)

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

Used by the host thread to send a message to the worker thread by transferring object ownership.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.postMessage9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Data to be sent to the worker thread. The data object must be sequenceable. For details about the supported parameter types, see Sequenceable Data Types.
transfer ArrayBuffer[] Yes ArrayBuffer instance holding an array of objects for which the ownership is transferred to the worker thread. After the transfer, the objects are available only in the worker thread. The array cannot be null.

Example

const workerInstance = new worker.Worker("workers/worker.ets");

let buffer = new ArrayBuffer(8);
workerInstance.postMessage(buffer, [buffer]);

postMessage(deprecated)

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

Used by the host thread to send a message to the worker thread by transferring object ownership or copying data.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.postMessage9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Data to be sent to the worker thread. The data object must be sequenceable. For details about the supported parameter types, see Sequenceable Data Types.
options PostMessageOptions No If this parameter is specified, it functions the same as ArrayBuffer[]. Specifically, the ownership of the objects in the array is transferred to the worker thread and becomes unavailable in the host thread. The objects are available only in the worker thread.
If this parameter is not specified, the default value undefined is used, and information is transferred to the worker thread by copying data.

Example

const workerInstance = new worker.Worker("workers/worker.ets");

workerInstance.postMessage("hello world");

let buffer = new ArrayBuffer(8);
workerInstance.postMessage(buffer, [buffer]);

on(deprecated)

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

Adds an event listener for the worker thread. This API provides the same functionality as addEventListener(deprecated).

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.on9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event to listen for.
listener EventListener Yes Callback to invoke when an event of the specified type occurs.

Example

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.on("alert", (e)=>{
    console.log("alert listener callback");
})

once(deprecated)

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

Adds an event listener for the worker thread and removes the event listener after it is invoked once.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.once9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event to listen for.
listener EventListener Yes Callback to invoke when an event of the specified type occurs.

Example

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.once("alert", (e)=>{
    console.log("alert listener callback");
})

off(deprecated)

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

Removes an event listener for the worker thread. This API provides the same functionality as removeEventListener(deprecated).

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.off9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event for which the event listener is to be removed.
listener EventListener No Callback to invoke when the listener is removed.

Example

const workerInstance = new worker.Worker("workers/worker.ets");
// Use on, once, or addEventListener to add a listener for the "alert" event, and use off to remove the listener.
workerInstance.off("alert");

terminate(deprecated)

terminate(): void

Terminates the worker thread to stop it from receiving messages.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.terminate9+ instead.

System capability: SystemCapability.Utils.Lang

Example

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.terminate();

onexit(deprecated)

onexit?: (code: number) => void

Called when the worker thread exits. The event handler is executed in the host thread. In the callback function, the code value is of the number type, where the value 1 indicates abnormal exit and 0 indicates normal exit.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.onexit9+ instead.

System capability: SystemCapability.Utils.Lang

Example

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.onexit = (code) => {
    console.log("onexit");
}

// onexit is executed in either of the following ways:
// Main thread
workerInstance.terminate();

// Worker thread
//parentPort.close()

onerror(deprecated)

onerror?: (err: ErrorEvent) => void

Called when an exception occurs during worker execution. The event handler is executed in the host thread. In the callback function, the err type is ErrorEvent, indicating the received abnormal data.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.onerror9+ instead.

System capability: SystemCapability.Utils.Lang

Example

import worker, { ErrorEvent } from '@ohos.worker';

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.onerror = (err: ErrorEvent) => {
  console.log("onerror" + err.message);
}

onmessage(deprecated)

onmessage?: (event: MessageEvent) => void

Called when the host thread receives a message sent by the worker thread through workerPort.postMessage. The event handler is executed in the host thread. In the callback function, the event type is MessageEvent, indicating the received message data.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.onmessage9+ instead.

System capability: SystemCapability.Utils.Lang

Example

import worker from '@ohos.worker';

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.onmessage = (e): void => {
    console.log("onmessage");
}

onmessageerror(deprecated)

onmessageerror?: (event: MessageEvent) => void

Called when the worker thread receives a message that cannot be serialized. The event handler is executed in the host thread. In the callback function, the event type is MessageEvent, indicating the received message data.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorker.onmessageerror9+ instead.

System capability: SystemCapability.Utils.Lang

Example

import worker from '@ohos.worker';

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.onmessageerror = (err) => {
    console.log("onmessageerror");
}

EventTarget(deprecated)

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use WorkerEventTarget9+ instead.

addEventListener(deprecated)

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

Adds an event listener for the worker thread. This API provides the same functionality as on(deprecated).

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use addEventListener9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event to listen for.
listener EventListener Yes Callback to invoke when an event of the specified type occurs.

Example

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})

removeEventListener(deprecated)

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

Removes an event listener for the worker thread. This API provides the same functionality as off(deprecated).

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use removeEventListener9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
type string Yes Type of the event for which the event listener is to be removed.
callback EventListener No Callback to invoke when the listener is removed.

Example

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeEventListener("alert");

dispatchEvent(deprecated)

dispatchEvent(event: Event): boolean

Dispatches the event defined for the worker thread.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use dispatchEvent9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
event Event Yes Event to dispatch.

Return value

Type Description
boolean Returns true if the event is dispatched successfully; returns false otherwise.

Example

const workerInstance = new worker.Worker("workers/worker.ets");

workerInstance.dispatchEvent({type:"eventType", timeStamp:0}); // timeStamp is not supported yet.

The dispatchEvent API can be used together with the on, once, and addEventListener APIs. The sample code is as follows:

const workerInstance = new worker.Worker("workers/worker.ets");

// Usage 1:
workerInstance.on("alert_on", (e)=>{
    console.log("alert listener callback");
})
workerInstance.once("alert_once", (e)=>{
    console.log("alert listener callback");
})
workerInstance.addEventListener("alert_add", (e)=>{
    console.log("alert listener callback");
})

// The event listener created by once is removed after being executed once.
workerInstance.dispatchEvent({type:"alert_once", timeStamp:0});// timeStamp is not supported yet.
// The event listener created by on will not be proactively deleted.
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_on", timeStamp:0});
// The event listener created by addEventListener will not be proactively deleted.
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});
workerInstance.dispatchEvent({type:"alert_add", timeStamp:0});

// Usage 2:
// The event type can be customized, and the special types "message", "messageerror", and "error" exist.
// When type = "message", the event handler defined by onmessage will also be executed.
// When type = "messageerror", the event handler defined by onmessageerror will also be executed.
// When type = "error", the event handler defined by onerror will also be executed.
// removeEventListener or off can be used to remove an event listener that is created by addEventListener, on, or once.

workerInstance.addEventListener("message", (e)=>{
    console.log("message listener callback");
})
workerInstance.onmessage = function(e) {
    console.log("onmessage : message listener callback");
}
// When dispatchEvent is called to distribute the "message" event, the callback passed in addEventListener and onmessage will be invoked.
workerInstance.dispatchEvent({type:"message", timeStamp:0});

removeAllListener(deprecated)

removeAllListener(): void

Removes all event listeners for the worker thread.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use removeAllListener9+ instead.

System capability: SystemCapability.Utils.Lang

Example

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeAllListener();

DedicatedWorkerGlobalScope(deprecated)

Implements communication between the worker thread and the host thread. The postMessage API is used to send messages to the host thread, and the close API is used to terminate the worker thread. This class inherits from WorkerGlobalScope.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorkerGlobalScope9+ instead.

postMessage(deprecated)

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

Used by the worker thread to send a message to the host thread by transferring object ownership.

NOTE
This API is deprecated since API version 9. You are advised to use ThreadWorkerGlobalScope9+.postMessage9+.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
messageObject Object Yes Data to be sent to the host thread. The data object must be sequenceable. For details about the supported parameter types, see Sequenceable Data Types.
transfer Transferable[] Yes Currently, this parameter is not supported.

postMessage9+

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

Used by the worker thread to send a message to the host thread by transferring object ownership.

NOTE

The DedicatedWorkerGlobalScope class is deprecated since API version 9. You are advised to use ThreadWorkerGlobalScope9+.postMessage9+.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
messageObject Object Yes Data to be sent to the host thread. The data object must be sequenceable. For details about the supported parameter types, see Sequenceable Data Types.
transfer ArrayBuffer[] Yes ArrayBuffer instance holding an array of objects for which the ownership is transferred to the host thread. After the transfer, the objects are available only in the host thread. The array cannot be null.

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.postMessage("hello world");
workerInstance.onmessage = (e): void => {
    // let data = e.data;
    console.log("receive data from worker.ets");
}
// worker.ets
import worker from '@ohos.worker';

const workerPort = worker.workerPort;
workerPort.onmessage = (e): void => {
    // let data = e.data;
    let buffer = new ArrayBuffer(5)
    workerPort.postMessage(buffer, [buffer]);
}

postMessage(deprecated)

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

Used by the worker thread to send a message to the host thread by transferring object ownership or copying data.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorkerGlobalScope9+.postMessage9+.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
messageObject Object Yes Data to be sent to the host thread. The data object must be sequenceable. For details about the supported parameter types, see Sequenceable Data Types.
options PostMessageOptions No If this parameter is specified, it functions the same as ArrayBuffer[]. Specifically, the ownership of the objects in the array is transferred to the host thread and becomes unavailable in the worker thread. The objects are available only in the host thread.
If this parameter is not specified, the default value undefined is used, and information is transferred to the host thread by copying data.

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.postMessage("hello world");
workerInstance.onmessage = (e): void => {
    // let data = e.data;
    console.log("receive data from worker.ets");
}
// worker.ets
import worker from '@ohos.worker';

const parentPort = worker.parentPort;
parentPort.onmessage = (e): void => {
    // let data = e.data;
    parentPort.postMessage("receive data from main thread");
}

close(deprecated)

close(): void

Terminates the worker thread to stop it from receiving messages.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorkerGlobalScope9+.close9+.

System capability: SystemCapability.Utils.Lang

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.Worker("workers/worker.ets");
// worker.ets
import workerfrom '@ohos.worker';

const parentPort = worker.parentPort;
parentPort.onmessage = (e): void => {
    parentPort.close()
}

onmessage(deprecated)

onmessage?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void

Called when the worker thread receives a message sent by the host thread through postMessage. The event handler is executed in the worker thread. In the callback function, this indicates the caller's DedicatedWorkerGlobalScope, and the ev type is MessageEvent, indicating the received message data.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorkerGlobalScope9+.onmessage9+.

System capability: SystemCapability.Utils.Lang

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.postMessage("hello world");
// worker.ets
import worker from '@ohos.worker';

const parentPort = worker.parentPort;
parentPort.onmessage = (e): void => {
    console.log("receive main thread message");
}

onmessageerror(deprecated)

onmessageerror?: (this: DedicatedWorkerGlobalScope, ev: MessageEvent) => void

Called when the worker thread receives a message that cannot be deserialized. The event handler is executed in the worker thread. In the callback function, this indicates the caller's DedicatedWorkerGlobalScope, and the ev type is MessageEvent, indicating the received message data.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use ThreadWorkerGlobalScope9+.onmessageerror9+.

System capability: SystemCapability.Utils.Lang

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.Worker("workers/worker.ets");
// worker.ets
import worker from '@ohos.worker';

const parentPort = worker.parentPort;
parentPort.onmessageerror = (e) => {
    console.log("worker.ets onmessageerror")
}

PostMessageOptions

Defines the object for which the ownership is to be transferred during data transfer. The object must be an ArrayBuffer instance. After the ownership is transferred, the object becomes unavailable in the sender and can be used only in the receiver.

System capability: SystemCapability.Utils.Lang

Name Type Readable Writable Description
transfer Object[] Yes Yes ArrayBuffer array used to transfer the ownership. The array cannot be null.

Event

Defines the event.

System capability: SystemCapability.Utils.Lang

Name Type Readable Writable Description
type string Yes No Type of the event.
timeStamp number Yes No Timestamp (accurate to millisecond) when the event is created. This parameter is not supported yet.

EventListener(deprecated)

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

Implements event listening.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use WorkerEventListener9+ instead.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
evt Event Yes Event class for the callback to invoke.

Return value

Type Description
void | Promise<void> Returns no value or returns a Promise.

Example

const workerInstance = new worker.Worker("workers/worker.ets");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})

ErrorEvent

Provides detailed information about the exception that occurs during worker execution. The ErrorEvent class inherits from Event.

System capability: SystemCapability.Utils.Lang

Name Type Readable Writable Description
message string Yes No Information about the exception.
filename string Yes No File where the exception is located.
lineno number Yes No Serial number of the line where the exception is located.
colno number Yes No Serial number of the column where the exception is located.
error Object Yes No Type of the exception.

MessageEvent<T>

Holds the data transferred between worker threads.

System capability: SystemCapability.Utils.Lang

Name Type Readable Writable Description
data T Yes No Data transferred between threads.

WorkerGlobalScope(deprecated)

Implements the running environment of the worker thread. The WorkerGlobalScope class inherits from EventTarget.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use GlobalScope9+ instead.

Attributes

System capability: SystemCapability.Utils.Lang

Name Type Readable Writable Description
name string Yes No Worker instance specified when there is a new Worker instance.
self WorkerGlobalScope & typeof globalThis Yes No WorkerGlobalScope.

onerror(deprecated)

onerror?: (ev: ErrorEvent) => void

Called when an exception occurs during worker execution. The event handler is executed in the worker thread. In the callback function, the ev type is ErrorEvent, indicating the received abnormal data.

NOTE
This API is supported since API version 7 and deprecated since API version 9. You are advised to use GlobalScope9+.onerror9+.

System capability: SystemCapability.Utils.Lang

Example

// Main thread
import worker from '@ohos.worker';

const workerInstance = new worker.Worker("workers/worker.ets")
// worker.ets
import worker, { ErrorEvent } from '@ohos.worker';

const parentPort = worker.parentPort
parentPort.onerror = (err: ErrorEvent) => {
    console.log("worker.ets onerror" + err.message)
}

More Information

Sequenceable Data Types

The following object types are supported: basic types except Symbol, Date, String, RegExp, Array, Map, Set, Object (simple objects only, for example, objects created using {} or new Object), ArrayBuffer, and typedArray. (Note that only attributes can be transferred for common objects. Prototypes and methods cannot be transferred.)

Exception: When an object created through a custom class is passed, no serialization error occurs. However, the attributes (such as Function) of the custom class cannot be passed through serialization.

NOTE
An FA project of API version 9 is used as an example.

// Main thread
import worker, { MessageEvents } from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("workers/worker.ets");
workerInstance.postMessage("message from main thread to worker");
workerInstance.onmessage = (d: MessageEvents): void => {
  // When the worker thread passes obj2, data contains obj2, excluding the Init or SetName method.
  let data: string  = d.data;
}
// worker.ets
import worker, { MessageEvents, ErrorEvent } from '@ohos.worker';

const workerPort = worker.workerPort;
class MyModel {
    name = "undefined"
    Init() {
        this.name = "MyModel"
    }
}
workerPort.onmessage = (d: MessageEvents): void => {
  console.log("worker.ets onmessage");
  let data: string = d.data;
  let func1 = () => {
    console.log("post message is function");
  }
  // workerPort.postMessage(func1); A serialization error occurs when passing func1.
  // let obj1: obj | null = null;
  // if (obj1) {
  //   workerPort.postMessage(obj1 as obj);  // A serialization error occurs when passing obj1.
  // }
  let obj2 = new MyModel();
  workerPort.postMessage(obj2);     // No serialization error occurs when passing obj2.
}
workerPort.onmessageerror = () => {
    console.log("worker.ets onmessageerror");
}
workerPort.onerror = (err: ErrorEvent) => {
    console.log("worker.ets onerror" + err.message);
}

Memory Model

The worker thread is implemented based on the actor model. In the worker interaction process, the JS main thread can create multiple worker threads, each of which are isolated and transfer data through serialization. They complete computing tasks and return the result to the main thread.

Each actor concurrently processes tasks of the main thread. For each actor, there is a message queue and a single-thread execution module. The message queue receives requests from the main thread and other actors; the single-thread execution module serially processes requests, sends requests to other actors, and creates new actors. These isolated actors use the asynchronous mode and can run concurrently.

Sample Code

NOTE
Two projects of API version 9 are used as an example.
Only the FA model is supported in API version 8 and earlier versions. If you want to use API version 8 or earlier, change the API for constructing the Worker instance and the API for creating an object in the worker thread for communicating with the main thread.

FA Model

// Main thread (The following assumes that the workers directory and pages directory are at the same level.)
import worker, { MessageEvents, ErrorEvent } from '@ohos.worker';

// Create a Worker instance in the main thread.
const workerInstance = new worker.ThreadWorker("workers/worker.ets");

// The main thread transfers information to the worker thread.
workerInstance.postMessage("123");

// The main thread receives information from the worker thread.
workerInstance.onmessage = (e: MessageEvents): void => {
    // data carries the information sent by the worker thread.
    let data: string = e.data;
    console.log("main thread onmessage");

    // Terminate the Worker instance.
    workerInstance.terminate();
}

// Call onexit().
workerInstance.onexit = (code) => {
    console.log("main thread terminate");
}

workerInstance.onerror = (err: ErrorEvent) => {
    console.log("main error message " + err.message);
}
// worker.ets
import worker, { MessageEvents, ErrorEvent } from '@ohos.worker';

// Create an object in the worker thread for communicating with the main thread.
const workerPort = worker.workerPort

// The worker thread receives information from the main thread.
workerPort.onmessage = (e: MessageEvents): void => {
    // data carries the information sent by the main thread.
    let data: string = e.data;
    console.log("worker.ets onmessage");

    // The worker thread sends information to the main thread.
    workerPort.postMessage("123")
}

// Trigger a callback when an error occurs in the worker thread.
workerPort.onerror = (err: ErrorEvent) => {
    console.log("worker.ets onerror");
}

Configuration of the build-profile.json5 file:

  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/entryability/workers/worker.ets"
      ]
    }
  }

Stage Model

// Main thread (The following assumes that the workers directory and pages directory are at different levels.)
import worker, { MessageEvents, ErrorEvent } from '@ohos.worker';

// Create a Worker instance in the main thread.
const workerInstance = new worker.ThreadWorker("entry/ets/pages/workers/worker.ets");

// The main thread transfers information to the worker thread.
workerInstance.postMessage("123");

// The main thread receives information from the worker thread.
workerInstance.onmessage = (e: MessageEvents): void => {
    // data carries the information sent by the worker thread.
    let data: string = e.data;
    console.log("main thread onmessage");

    // Terminate the Worker instance.
    workerInstance.terminate();
}
// Call onexit().
workerInstance.onexit = (code) => {
    console.log("main thread terminate");
}

workerInstance.onerror = (err: ErrorEvent) => {
    console.log("main error message " + err.message);
}
// worker.ets
import worker, { MessageEvents, ErrorEvent } from '@ohos.worker';

// Create an object in the worker thread for communicating with the main thread.
const workerPort = worker.workerPort

// The worker thread receives information from the main thread.
workerPort.onmessage = (e: MessageEvents): void => {
    // data carries the information sent by the main thread.
    let data: string = e.data;
    console.log("worker.ets onmessage");

    // The worker thread sends information to the main thread.
    workerPort.postMessage("123")
}

// Trigger a callback when an error occurs in the worker thread.
workerPort.onerror = (err: ErrorEvent) => {
    console.log("worker.ets onerror" + err.message);
}

Configuration of the build-profile.json5 file:

  "buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/pages/workers/worker.ets"
      ]
    }
  }