@ohos.worker (Worker Startup)

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.

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 Readable Writable Description
type "classic" | "module" Yes Yes Mode in which the Worker instance executes the script. The default value is classic. The module type is not supported yet.
name string Yes Yes Name of the worker thread.
shared boolean Yes Yes Sharing of the Worker instance is not supported yet.

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 Directory of the script to be executed by the Worker instance.
In the FA or stage model, DevEco Studio creates a Worker project in either of the following scenarios:
(a) The script directory is at the same level as the pages directory.
(b) The script directory is at a different level from the pages directory.
options WorkerOptions No Options that can be set for the Worker instance.

Return value

Type Description
ThreadWorker Returns the ThreadWorker instance created; returns undefined if the ThreadWorker instance fails to be created.

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

import worker from '@ohos.worker';
// Create a Worker instance.

// In the FA model, the workers directory is at the same level as the pages directory in the entry module.
const workerFAModel01 = new worker.ThreadWorker("workers/worker.js", {name:"first worker in FA model"});
// In the FA model, the workers directory is at the same level as the parent directory of the pages directory in the entry module.
const workerFAModel02 = new worker.ThreadWorker("../workers/worker.js");

// In the stage model, the workers directory is at the same level as the pages directory in the entry module.
const workerStageModel01 = new worker.ThreadWorker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
// In the stage model, the workers directory is at the same level as the parent directory of the pages directory in the entry module.
const workerStageModel02 = new worker.ThreadWorker('entry/ets/pages/workers/worker.ts');

// For the script URL "entry/ets/workers/worker.ts" in the stage model:
// entry is the value of the name attribute under module in the module.json5 file, and ets indicates the programming language in use.
// The script URL is related to the level of the workers directory where the worker file is located and is irrelevant to the file where the new worker is located.

// In the esmodule build scenario of the stage model, the script URL specification @bundle:bundlename/entryname/ets/workerdir/workerfile is added.
// @bundle is a fixed label, bundlename indicates the bundle name, entryname indicates the module name, and ets indicates the programming language in use.
// workerdir indicates the directory where the worker file is located, and workerfile indicates the worker file name.
// In the stage model, the workers directory is at the same level as the pages directory in the entry module, and bundlename is com.example.workerdemo.
const workerStageModel03 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/workers/worker');
// In the stage model, the workers directory is at the same level as the parent directory of the pages directory in the entry module, and bundlename is com.example.workerdemo.
const workerStageModel04 = new worker.ThreadWorker('@bundle:com.example.workerdemo/entry/ets/pages/workers/worker');

Depending on whether the workers directory and pages directory are at the same level, you may need to configure the buildOption attribute in the build-profile.json5 file.

(1) The workers directory and pages directory are at the same level.

In the FA model:

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

In the stage model:

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

(2) The workers directory and pages directory are at different levels.

In the FA model:

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

In the stage model:

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

postMessage9+

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

Sends a message to the worker thread. The data type of the message must be sequenceable. For details about the sequenceable data types, see More Information.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Message to be sent to the worker thread.
transfer ArrayBuffer[] Yes An ArrayBuffer object can be transferred. The value null should not be passed in the array.

Error codes

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

ID Error Message
10200004 Worker instance is not running.
10200006 Serializing an uncaught exception failed.

Example

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

workerInstance.postMessage("hello world");

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

postMessage9+

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

Sends a message to the worker thread. The data type of the message must be sequenceable. For details about the sequenceable data types, see More Information.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Message to be sent to the worker thread.
options PostMessageOptions No ArrayBuffer instances that can be transferred. The transferList array cannot contain null.

Error codes

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

ID Error Message
10200004 Worker instance is not running.
10200006 Serializing an uncaught exception failed.

Example

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

workerInstance.postMessage("hello world");

var 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. 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.ts");
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. 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.ts");
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 an event of the specified type occurs. Callback of the event listener to remove.

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.ts");
// Use on, once, or addEventListener to add a listener for the "alert" event, and use off to remove the listener.
workerInstance.off("alert");

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.ts");
workerInstance.terminate();

onexit9+

onexit?: (code: number) => void

Defines the event handler to be called when the worker thread exits. The handler is executed in the host thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
code number Yes Code indicating the worker thread exit state.

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.ts");
workerInstance.onexit = function(e) {
    console.log("onexit");
}

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

// Worker thread:
//parentPort.close()

onerror9+

onerror?: (err: ErrorEvent) => void

Defines the event handler to be called when an exception occurs during worker execution. The event handler is executed in the host thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
err ErrorEvent Yes Error data.

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.ts");
workerInstance.onerror = function(e) {
    console.log("onerror");
}

onmessage9+

onmessage?: (event: MessageEvents) => void

Defines the event handler to be called when the host thread receives a message sent by the worker thread through parentPort.postMessage. The event handler is executed in the host thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
event MessageEvents Yes Message received.

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.ts");
workerInstance.onmessage = function(e) {
    // e: MessageEvents. The usage is as follows:
    // let data = e.data;
    console.log("onmessage");
}

onmessageerror9+

onmessageerror?: (event: MessageEvents) => void

Defines the event handler to be called when the worker thread receives a message that cannot be serialized. The event handler is executed in the host thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
event MessageEvents Yes Error data.

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.ts");
workerInstance.onmessageerror= function(e) {
    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.ts");
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 an event of the specified type occurs. Callback of the event listener to remove.

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.ts");
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.ts");

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.ThreadWorker("entry/ets/workers/worker.ts");

// 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});

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.ts");
workerInstance.addEventListener("alert", (e)=>{
    console.log("alert listener callback");
})
workerInstance.removeAllListener();

WorkerEventTarget9+

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.ts");
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 an event of the specified type occurs. Callback of the event listener to remove.

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.ts");
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.ts");

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.ThreadWorker("entry/ets/workers/worker.ts");

// 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 be always valid and 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});

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.ts");
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;

Sends a message to the host thread from the worker thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Message to be sent to the worker thread.
transfer ArrayBuffer[] Yes An ArrayBuffer object can be transferred. The value null should not be passed in the array.

Error codes

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

ID Error Message
10200004 Worker instance is not running.
10200006 Serializing an uncaught exception failed.

Example

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.postMessage("hello world");
workerInstance.onmessage = function(e) {
    // let data = e.data;
    console.log("receive data from worker.js");
}
// worker.ts
import worker from '@ohos.worker';
const workerPort = worker.workerPort;
workerPort.onmessage = function(e){
    // let data = e.data;
    var buffer = new ArrayBuffer(8);
    workerPort.postMessage(buffer, [buffer]);
}

postMessage9+

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

Sends a message to the host thread from the worker thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Message to be sent to the worker thread.
options PostMessageOptions No ArrayBuffer instances that can be transferred. The transferList array cannot contain null.

Error codes

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

ID Error Message
10200004 Worker instance is not running.
10200006 Serializing an uncaught exception failed.

Example

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.postMessage("hello world");
workerInstance.onmessage = function(e) {
    // let data = e.data;
    console.log("receive data from worker.js");
}
// worker.ts
import worker from '@ohos.worker';
const workerPort = worker.workerPort;
workerPort.onmessage = function(e){
    // let data = e.data;
    workerPort.postMessage("receive data from main.js");
}

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.js
import worker from '@ohos.worker';
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
// worker.ts
import worker from '@ohos.worker';
const workerPort = worker.workerPort;
workerPort.onmessage = function(e) {
    workerPort.close()
}

onmessage9+

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

Defines the event handler to be called when the worker thread receives a message sent by the host thread through postMessage. The event handler is executed in the worker thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
this ThreadWorkerGlobalScope Yes Caller.
ev MessageEvents Yes Message received.

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.js
import worker from '@ohos.worker';
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
workerInstance.postMessage("hello world");
// worker.ts
import worker from '@ohos.worker';
const workerPort = worker.workerPort;
workerPort.onmessage = function(e) {
    console.log("receive main.js message");
}

onmessageerror9+

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

Defines the event handler to be called when the worker thread receives a message that cannot be deserialized. The event handler is executed in the worker thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
this ThreadWorkerGlobalScope Yes Caller.
ev MessageEvents Yes Error data.

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.js
import worker from '@ohos.worker';
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts");
// worker.ts
import worker from '@ohos.worker';
const parentPort = worker.workerPort;
parentPort.onmessageerror = function(e) {
    console.log("worker.js 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.ts");
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

Defines the event handler to be called when an exception occurs during worker execution. The event handler is executed in the worker thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
ev ErrorEvent Yes Error data.

Example

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.ThreadWorker("entry/ets/workers/worker.ts")
// worker.ts
import worker from '@ohos.worker';
const workerPort = worker.workerPort
workerPort.onerror = function(e){
    console.log("worker.js onerror")
}

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.

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 Directory of the script to be executed by the Worker instance.
In the FA or stage model, DevEco Studio creates a Worker project in either of the following scenarios:
(a) The script directory is at the same level as the pages directory.
(b) The script directory is at a different level from the pages directory.
options WorkerOptions No Options that can be set for the Worker instance.

Return value

Type Description
Worker Returns the Worker instance created; returns undefined if the Worker instance fails to be created.

Example

import worker from '@ohos.worker';
// Create a Worker instance.

// In the FA model, the workers directory is at the same level as the pages directory.
const workerFAModel01 = new worker.Worker("workers/worker.js", {name:"first worker in FA model"});
// In the FA model, the workers directory is at the same level as the parent directory of the pages directory.
const workerFAModel02 = new worker.Worker("../workers/worker.js");

// In the stage model, the workers directory is at the same level as the pages directory.
const workerStageModel01 = new worker.Worker('entry/ets/workers/worker.ts', {name:"first worker in Stage model"});
// In the stage model, the workers directory is at the same level as the child directory of the pages directory.
const workerStageModel02 = new worker.Worker('entry/ets/pages/workers/worker.ts');

// For the script URL "entry/ets/workers/worker.ts" in the stage model:
// entry is the value of the name attribute under module in the module.json5 file.
// ets indicates the programming language in use.

Depending on whether the workers directory and pages directory are at the same level, you may need to configure the buildOption attribute in the build-profile.json5 file.

(1) The workers directory and pages directory are at the same level.

In the FA model:

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

In the stage model:

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

(2) The workers directory and pages directory are at different levels.

In the FA model:

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

In the stage model:

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

postMessage(deprecated)

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

Sends a message to the worker thread. The data type of the message must be sequenceable. For details about the sequenceable data types, see More Information.

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 Message to be sent to the worker thread.
transfer ArrayBuffer[] Yes ArrayBuffer instances that can be transferred.

Example

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

workerInstance.postMessage("hello world");

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

postMessage(deprecated)

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

Sends a message to the worker thread. The data type of the message must be sequenceable. For details about the sequenceable data types, see More Information.

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 Message to be sent to the worker thread.
options PostMessageOptions No ArrayBuffer instances that can be transferred. The transferList array cannot contain null.

Example

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

workerInstance.postMessage("hello world");

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.js");
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.js");
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 of the event listener to remove.

Example

const workerInstance = new worker.Worker("workers/worker.js");
// 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.js");
workerInstance.terminate();

onexit(deprecated)

onexit?: (code: number) => void

Defines the event handler to be called when the worker thread exits. The handler is executed in the host thread.

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

Parameters

Name Type Mandatory Description
code number Yes Code indicating the worker thread exit state.

Example

const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.onexit = function(e) {
    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

Defines the event handler to be called when an exception occurs during worker execution. The event handler is executed in the host thread.

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

Parameters

Name Type Mandatory Description
err ErrorEvent Yes Error data.

Example

const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.onerror = function(e) {
    console.log("onerror");
}

onmessage(deprecated)

onmessage?: (event: MessageEvent) => void

Defines the event handler to be called when the host thread receives a message sent by the worker thread through parentPort.postMessage. The event handler is executed in the host thread.

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

Parameters

Name Type Mandatory Description
event MessageEvent Yes Message received.

Example

const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.onmessage = function(e) {
    // e: MessageEvent. The usage is as follows:
    // let data = e.data;
    console.log("onmessage");
}

onmessageerror(deprecated)

onmessageerror?: (event: MessageEvent) => void

Defines the event handler to be called when the worker thread receives a message that cannot be serialized. The event handler is executed in the host thread.

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

Parameters

Name Type Mandatory Description
event MessageEvent Yes Error data.

Example

const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.onmessageerror= function(e) {
    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.js");
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 of the event listener to remove.

Example

const workerInstance = new worker.Worker("workers/worker.js");
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.js");

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.js");

// 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.js");
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.

postMessage9+

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

Sends a message to the host thread from the worker thread.

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Message to be sent to the worker thread.
transfer ArrayBuffer[] Yes An ArrayBuffer object can be transferred. The value null should not be passed in the array.

Example

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.postMessage("hello world");
workerInstance.onmessage = function(e) {
    // let data = e.data;
    console.log("receive data from worker.js");
}
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e){
    // let data = e.data;
    let buffer = new ArrayBuffer(5)
    parentPort.postMessage(buffer, [buffer]);
}

postMessage(deprecated)

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

Sends a message to the host thread from the worker thread.

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

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
message Object Yes Message to be sent to the worker thread.
options PostMessageOptions No ArrayBuffer instances that can be transferred. The transferList array cannot contain null.

Example

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.postMessage("hello world");
workerInstance.onmessage = function(e) {
    // let data = e.data;
    console.log("receive data from worker.js");
}
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e){
    // let data = e.data;
    parentPort.postMessage("receive data from main.js");
}

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+ instead.

System capability: SystemCapability.Utils.Lang

Example

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js");
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e) {
    parentPort.close()
}

onmessage(deprecated)

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

Defines the event handler to be called when the worker thread receives a message sent by the host thread through postMessage. The event handler is executed in the worker thread.

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

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
this DedicatedWorkerGlobalScope Yes Caller.
ev MessageEvent Yes Message received.

Example

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js");
workerInstance.postMessage("hello world");
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessage = function(e) {
    console.log("receive main.js message");
}

onmessageerror(deprecated)

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

Defines the event handler to be called when the worker thread receives a message that cannot be deserialized. The event handler is executed in the worker thread.

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

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
this DedicatedWorkerGlobalScope Yes Caller.
ev MessageEvent Yes Error data.

Example

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js");
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort;
parentPort.onmessageerror = function(e) {
    console.log("worker.js onmessageerror")
}

PostMessageOptions

Specifies the object whose ownership needs to be transferred during data transfer. The object must be ArrayBuffer.

System capability: SystemCapability.Utils.Lang

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

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.js");
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

Defines the event handler to be called when an exception occurs during worker execution. The event handler is executed in the worker thread.

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

System capability: SystemCapability.Utils.Lang

Parameters

Name Type Mandatory Description
ev ErrorEvent Yes Error data.

Example

// main.js
import worker from '@ohos.worker';
const workerInstance = new worker.Worker("workers/worker.js")
// worker.js
import worker from '@ohos.worker';
const parentPort = worker.parentPort
parentPort.onerror = function(e){
    console.log("worker.js onerror")
}

More Information

Sequenceable Data Types

Type Remarks Supported
All primitive types The Symbol type is not included. Yes
Date Yes
String Yes
RegExp Yes
Array Yes
Map Yes
Set Yes
Object Only plain objects are supported. Objects with functions are not supported. Yes
ArrayBuffer The transfer capability is provided. Yes
TypedArray Yes

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.js
import worker from '@ohos.worker';
const workerInstance = new worker.ThreadWorker("workers/worker.js");
workerInstance.postMessage("message from main to worker");
workerInstance.onmessage = function(d) {
  // When the worker thread passes obj2, data contains obj2, excluding the Init or SetName method.
  let data = d.data;
}
// worker.js
import worker from '@ohos.worker';
const workerPort = worker.workerPort;
class MyModel {
    name = "undefined"
    Init() {
        this.name = "MyModel"
    }
}
workerPort.onmessage = function(d) {
    console.log("worker.js onmessage");
    let data = d.data;
    let func1 = function() {
        console.log("post message is function");
    }
    let obj1 = {
        "index": 2,
        "name1": "zhangshan",
        setName() {
            this.index = 3;
        }
    }
    let obj2 = new MyModel();
    // workerPort.postMessage(func1); A serialization error occurs when passing func1.
    // workerPort.postMessage(obj1); A serialization error occurs when passing obj1.
    workerPort.postMessage(obj2);     // No serialization error occurs when passing obj2.
}
workerPort.onmessageerror = function(e) {
    console.log("worker.js onmessageerror");
}
workerPort.onerror = function(e) {
    console.log("worker.js onerror");
}

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 sequentialization. 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.

Precautions

  • Currently, a maximum of seven workers can co-exist.
  • In API version 8 and earlier versions, when the number of Worker instances exceeds the upper limit, the error "Too many workers, the number of workers exceeds the maximum." is thrown.
  • Since API version 9, when the number of Worker instances exceeds the upper limit, the business error "Worker initialization failure, the number of workers exceeds the maximum" is thrown.
  • To proactively destroy a worker thread, you can call terminate() or parentPort.close() of the newly created Worker instance.
  • Since API version 9, if a Worker instance in a non-running state (such as destroyed or being destroyed) calls an API, a business error is thrown.
  • Creating and terminating worker threads consume performance. Therefore, you are advised to manage available workers and reuse them.
  • Do not use both new worker.Worker and new worker.ThreadWorker to create a Worker project. Otherwise, Worker functions abnormally. Since API version 9, you are advised to use new worker.ThreadWorker. In API version 8 and earlier versions, you are advised to use new worker.Worker.
  • When creating a Worker project, do not import any UI construction method (such as .ets file) to the worker thread file (for example, worker.ts used in this document). Otherwise, the worker module becomes invalid. To check whether any UI construction method has been imported, decompress the generated HAP file, find worker.js in the directory where the worker thread is created, and search for the keyword View globally. If the keyword exists, a UI construction method has been packaged in worker.js. If this is your case, change the directory level of src in the statement import "xxx" from src in the worker thread file.

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.js (The following assumes that the workers directory and pages directory are at the same level.)
import worker from '@ohos.worker';
// Create a Worker instance in the main thread.
const workerInstance = new worker.ThreadWorker("workers/worker.ts");
// Create either a .json or .ts file.
// const workerInstance = new worker.ThreadWorker("workers/worker.js");

// In versions earlier than API version 9, use the following to create a Worker instance in the main thread.
// const workerInstance = new worker.Worker("workers/worker.js");

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

// The main thread receives information from the worker thread.
workerInstance.onmessage = function(e) {
    // data carries the information sent by the worker thread.
    let data = e.data;
    console.log("main.js onmessage");

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

// Call onexit().
workerInstance.onexit = function() {
    console.log("main.js terminate");
}
// worker.ts
import worker from '@ohos.worker';

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

// In versions earlier than API version 9, use the following to create an object in the worker thread for communicating with the main thread.
// const parentPort = worker.parentPort

// The worker thread receives information from the main thread.
workerPort.onmessage = function(e) {
    // data carries the information sent by the main thread.
    let data = e.data;
    console.log("worker.ts 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= function(e) {
    console.log("worker.ts onerror");
}

Configuration of the build-profile.json5 file:

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

Stage Model

// main.js (The following assumes that the workers directory and pages directory are at different levels.)
import worker from '@ohos.worker';

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

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

// The main thread receives information from the worker thread.
workerInstance.onmessage = function(e) {
    // data carries the information sent by the worker thread.
    let data = e.data;
    console.log("main.js onmessage");

    // Terminate the Worker instance.
    workerInstance.terminate();
}
// Call onexit().
workerInstance.onexit = function() {
    console.log("main.js terminate");
}
// worker.ts
import worker 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 = function(e) {
    // data carries the information sent by the main thread.
    let data = e.data;
    console.log("worker.ts 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= function(e) {
    console.log("worker.ts onerror");
}

Configuration of the build-profile.json5 file:

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