• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Worker常驻线程通过TaskPool进行多任务并发处理
2<!--Kit: ArkTS-->
3<!--Subsystem: CommonLibrary-->
4<!--Owner: @lijiamin2025-->
5<!--Designer: @weng-changcheng-->
6<!--Tester: @kirl75; @zsw_zhushiwei-->
7<!--Adviser: @ge-yafang-->
8
9ArkTS应用开发过程中,可以选择TaskPool或Worker线程进行多任务并发处理,也可以两种并发能力都选择。
10
11本示例将说明在Worker线程中通过TaskPool执行并发任务。
12
131. 在主线程中创建Worker线程并发送消息。
14
15   ```ts
16   // Index.ets
17   import { MessageEvents, worker } from '@kit.ArkTS';
18
19   @Entry
20   @Component
21   struct Index {
22     @State message: string = 'Hello World';
23
24     build() {
25       RelativeContainer() {
26         Text(this.message)
27           .id('HelloWorld')
28           .fontSize($r('app.float.page_text_font_size'))
29           .fontWeight(FontWeight.Bold)
30           .alignRules({
31             center: { anchor: '__container__', align: VerticalAlign.Center },
32             middle: { anchor: '__container__', align: HorizontalAlign.Center }
33           })
34           .onClick(() => {
35             // 1. 创建Worker实例
36             const myWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets');
37
38             // 2. 接收Worker返回的结果
39             myWorker.onmessage = (e: MessageEvents) => {
40               console.info('主线程收到最终结果:', e.data.result);
41               myWorker.terminate(); // 选择合适的时机销毁Worker
42             };
43
44             // 3. 向Worker发送启动指令
45             myWorker.postMessage({ type: 'start', data: 10 });
46           })
47       }
48       .height('100%')
49       .width('100%')
50     }
51   }
52   ```
53
542. 在Worker线程中调用TaskPool执行并发任务。
55
56   ```ts
57   // Worker.ets
58   import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
59   import { taskpool } from '@kit.ArkTS';
60
61   const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
62   workerPort.onmessage = async (e: MessageEvents) => {
63     if (e.data.type === 'start') {
64       // 模拟Worker数据处理
65       const processedData = heavyComputation(e.data.data);
66
67       // 调用TaskPool执行并发任务
68       const task = new taskpool.Task(parallelTask, processedData);
69       const result = await taskpool.execute(task);
70       console.info('Worker线程返回结果: ', result);
71
72       // 将最终结果返回主线程
73       workerPort.postMessage({
74         status: 'success',
75         result: result
76       });
77     }
78   }
79
80   function heavyComputation(base: number): number {
81     let sum = 0;
82     for (let i = 0; i < base * 10; i++) {
83       sum += Math.sqrt(i);
84     }
85     return sum;
86   }
87
88   @Concurrent
89   function parallelTask(base: number): number {
90     let total = 0;
91     for (let i = 0; i < base; i++) {
92       total += i % 2 === 0 ? i : -i;
93     }
94     console.info('TaskPool线程计算结果: ', total);
95     return total;
96   }
97   ```