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