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 ```