harmony 鸿蒙Worker常驻线程通过TaskPool进行多任务并发处理

  • 2025-06-12
  • 浏览 (4)

Worker常驻线程通过TaskPool进行多任务并发处理

ArkTS应用开发过程中,可以选择TaskPool或Worker线程进行多任务并发处理,也可以两种并发能力都选择。

本示例将说明在Worker线程中通过TaskPool执行并发任务。

  1. 在主线程中创建Worker线程并发送消息。
   // Index.ets
   import { worker } from '@kit.ArkTS';
   
   @Entry
   @Component
   struct Index {
     @State message: string = 'Hello World';
   
     build() {
       RelativeContainer() {
         Text(this.message)
           .id('HelloWorld')
           .fontSize($r('app.float.page_text_font_size'))
           .fontWeight(FontWeight.Bold)
           .alignRules({
             center: { anchor: '__container__', align: VerticalAlign.Center },
             middle: { anchor: '__container__', align: HorizontalAlign.Center }
           })
           .onClick(() => {
             // 1. 创建Worker实例
             const myWorker = new worker.ThreadWorker('entry/ets/workers/Worker.ets');
   
             // 2. 接收Worker返回的结果
             myWorker.onmessage = (e) => {
               console.log('主线程收到最终结果:', e.data.result);
               myWorker.terminate(); // 销毁Worker
             };
   
             // 3. 向Worker发送启动指令
             myWorker.postMessage({ type: 'start', data: 10 });
           })
       }
       .height('100%')
       .width('100%')
     }
   }
  1. 在Worker线程中调用TaskPool执行并发任务。
   // Worker.ets
   import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
   import { taskpool } from '@kit.ArkTS';
   
   const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
   workerPort.onmessage = async (e: MessageEvents) => {
     if (e.data.type === 'start') {
       // 模拟Worker数据处理
       const processedData = heavyComputation(e.data.data);
   
       // 调用TaskPool执行并发任务
       const task = new taskpool.Task(parallelTask, processedData);
       const result = await taskpool.execute(task);
       console.log('Worker线程返回结果: ', result);
   
       // 将最终结果返回主线程
       workerPort.postMessage({
         status: 'success',
         result: result
       });
     }
   }
   
   function heavyComputation(base: number): number {
     let sum = 0;
     for (let i = 0; i < base * 10; i++) {
       sum += Math.sqrt(i);
     }
     return sum;
   }
   
   @Concurrent
   function parallelTask(base: number): number {
     let total = 0;
     for (let i = 0; i < base; i++) {
       total += i % 2 === 0 ? i : -i;
     }
     console.log('TaskPool线程计算结果: ', total);
     return total;
   }

你可能感兴趣的鸿蒙文章

harmony 鸿蒙ArkTS(方舟编程语言)

harmony 鸿蒙在build-profile.json5中配置arkOptions

harmony 鸿蒙异步锁

harmony 鸿蒙方舟字节码文件格式

harmony 鸿蒙方舟字节码函数命名规则

harmony 鸿蒙方舟字节码基本原理

harmony 鸿蒙方舟字节码概述

harmony 鸿蒙共享容器

harmony 鸿蒙异步等待

harmony 鸿蒙ArkTS跨语言交互

0  赞