• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 使用Worker进行线程间通信
2
3
4[Worker](../reference/apis/js-apis-worker.md)是与主线程并行的独立线程。创建Worker的线程被称为宿主线程,Worker工作的线程被称为Worker线程。创建Worker时传入的脚本文件在Worker线程中执行,通常在Worker线程中处理耗时的操作,需要注意的是,Worker中不能直接更新Page。
5
6
7Worker的开发步骤如下:
8
9
101. 在工程的[模块级build-profile.json5](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ohos-building-configuration-0000001218440654#section6887184182020)文件的buildOption属性中添加配置信息。
11
12   ```ts
13   "buildOption": {
14     "sourceOption": {
15       "workers": [
16         "./src/main/ets/workers/worker.ts"
17       ]
18     }
19   }
20   ```
21
222. 根据build-profile.json5中的配置创建对应的worker.ts文件。
23
24   ```ts
25   import worker from '@ohos.worker';
26
27   let parent = worker.workerPort;
28
29   // 处理来自主线程的消息
30   parent.onmessage = function(message) {
31     console.info("onmessage: " + message)
32     // 发送消息到主线程
33     parent.postMessage("message from worker thread.")
34   }
35   ```
36
373. 主线程中使用如下方式初始化和使用worker。
38   - Stage模型:
39
40      ```ts
41      import worker from '@ohos.worker';
42
43      let wk = new worker.ThreadWorker("entry/ets/workers/worker.ts");
44
45      // 发送消息到worker线程
46      wk.postMessage("message from main thread.")
47
48      // 处理来自worker线程的消息
49      wk.onmessage = function(message) {
50        console.info("message from worker: " + message)
51
52        // 根据业务按需停止worker线程
53        wk.terminate();
54      }
55      ```
56
57   - FA模型:
58
59      ```ts
60      import worker from '@ohos.worker';
61
62      let wk = new worker.ThreadWorker("../workers/worker.ts");
63
64      // 发送消息到worker线程
65      wk.postMessage("message from main thread.")
66
67      // 处理来自worker线程的消息
68      wk.onmessage = function(message) {
69        console.info("message from worker: " + message)
70
71        // 根据业务按需停止worker线程
72        wk.terminate();
73      }
74      ```
75
76> **说明:**
77>
78> - build-profile.json5中配置的worker.ts的相对路径都为`./src/main/ets/workers/worker.ts`时,在Stage模型下创建worker需要传入路径`entry/ets/workers/worker.ts`;在FA模型下创建worker需要传入路径`../workers/worker.ts`。
79> - 主线程与Worker线程间支持的数据类型参考[序列化支持类型](../reference/apis/js-apis-worker.md#序列化支持类型)。
80