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