1# @ohos.taskpool(启动任务池) 2 3任务池(taskpool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任务进行如任务执行、任务取消的操作。理论上您可以使用任务池API创建数量不受限制的任务,但是出于内存因素不建议您这样做。此外,不建议您在任务中执行阻塞操作,特别是无限期阻塞操作,长时间的阻塞操作占据工作线程,可能会阻塞其他任务调度,影响您的应用性能。 4 5您所创建的同一优先级任务的执行顺序可以由您决定,任务真实执行的顺序与您调用任务池API提供的任务执行接口顺序一致。任务默认优先级是MEDIUM。 6 7当同一时间待执行的任务数量大于任务池工作线程数量,任务池会根据负载均衡机制进行扩容,增加工作线程数量,减少整体等待时长。同样,当执行的任务数量减少,工作线程数量大于执行任务数量,部分工作线程处于空闲状态,任务池会根据负载均衡机制进行缩容,减少工作线程数量。 8 9任务池API以数字形式返回错误码。有关各个错误码的更多信息,请参阅文档[语言基础类库错误码](errorcode-utils.md)。 10 11taskpool使用过程中的相关注意点请查[TaskPool注意事项](../../arkts-utils/taskpool-introduction.md#taskpool注意事项)。 12 13> **说明:** 14> 15> 本模块首批接口从API version 9 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 16 17## 导入模块 18 19```ts 20import { taskpool } from '@kit.ArkTS'; 21``` 22## taskpool.execute 23 24execute(func: Function, ...args: Object[]): Promise\<Object> 25 26将待执行的函数放入taskpool内部任务队列, 函数不会立即执行,而是等待分发到工作线程执行。当前执行模式不可取消任务。 27 28**系统能力:** SystemCapability.Utils.Lang 29 30**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 31 32**参数:** 33 34| 参数名 | 类型 | 必填 | 说明 | 35| ------ | --------- | ---- | ---------------------------------------------------------------------- | 36| func | Function | 是 | 执行的逻辑需要传入函数,必须使用[@Concurrent装饰器](../../arkts-utils/taskpool-introduction.md#concurrent装饰器)装饰,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 37| args | Object[] | 否 | 执行逻辑的函数所需要的入参,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 38 39**返回值:** 40 41| 类型 | 说明 | 42| ----------------- | ------------------------------------ | 43| Promise\<Object> | Promise对象,返回任务函数的执行结果。 | 44 45**错误码:** 46 47以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 48 49| 错误码ID | 错误信息 | 50| -------- | -------------------------------------------- | 51| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 52| 10200006 | An exception occurred during serialization. | 53| 10200014 | The function is not marked as concurrent. | 54 55**示例:** 56 57```ts 58@Concurrent 59function printArgs(args: number): number { 60 console.info("printArgs: " + args); 61 return args; 62} 63 64taskpool.execute(printArgs, 100).then((value: Object) => { // 100: test number 65 console.info("taskpool result: " + value); 66}); 67``` 68 69 70## taskpool.execute<sup>13+</sup> 71 72execute<A extends Array\<Object>, R>(func: (...args: A) => R | Promise\<R>, ...args: A): Promise\<R> 73 74校验并发函数的参数类型和返回类型后,将待执行的函数放入taskpool内部任务队列。 75 76**系统能力:** SystemCapability.Utils.Lang 77 78**原子化服务API**:从API version 13 开始,该接口支持在原子化服务中使用。 79 80**参数:** 81 82| 参数名 | 类型 | 必填 | 说明 | 83| ------ | --------- | ---- | ---------------------------------------------------------------------- | 84| func | (...args: A) => R \| Promise\<R> | 是 | 执行的逻辑需要传入函数,必须使用[@Concurrent装饰器](../../arkts-utils/taskpool-introduction.md#concurrent装饰器)装饰,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 85| args | A | 否 | 执行逻辑的函数所需要的入参,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 86 87**返回值:** 88 89| 类型 | 说明 | 90| ----------------- | ------------------------------------ | 91| Promise\<R> | Promise对象,返回任务函数的执行结果。 | 92 93**错误码:** 94 95以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 96 97| 错误码ID | 错误信息 | 98| -------- | -------------------------------------------- | 99| 401 | Parameter error. Possible causes: 1.Incorrect parameter types; 2.Parameter verification failed. | 100| 10200006 | An exception occurred during serialization. | 101| 10200014 | The function is not marked as concurrent. | 102 103**示例:** 104 105```ts 106@Concurrent 107function printArgs(args: number): number { 108 console.info("printArgs: " + args); 109 return args; 110} 111 112@Concurrent 113function testWithThreeParams(a: number, b: string, c: number): string { 114 return b; 115} 116 117@Concurrent 118function testWithArray(args: [number, string]): string { 119 return "success"; 120} 121 122taskpool.execute<[number], number>(printArgs, 100).then((value: number) => { // 100: test number 123 console.info("taskpool result: " + value); 124}); 125 126taskpool.execute<[number, string, number], string>(testWithThreeParams, 100, "test", 100).then((value: string) => {}) 127 128taskpool.execute<[[number, string]], string>(testWithArray, [100, "test"]).then((value: string) => {}) 129``` 130 131 132## taskpool.execute 133 134execute(task: Task, priority?: Priority): Promise\<Object> 135 136将创建好的任务放入taskpool内部任务队列,任务不会立即执行,而是等待分发到工作线程执行。当前执行模式可以设置任务优先级和尝试调用cancel进行任务取消。该任务不可以是任务组任务和串行队列任务。若该任务非长时任务,可以多次调用执行,长时任务仅支持执行一次。 137 138**系统能力:** SystemCapability.Utils.Lang 139 140**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 141 142**参数:** 143 144| 参数名 | 类型 | 必填 | 说明 | 145| -------- | --------------------- | ---- | ---------------------------------------- | 146| task | [Task](#task) | 是 | 需要在任务池中执行的任务。 | 147| priority | [Priority](#priority) | 否 | 等待执行的任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 148 149**返回值:** 150 151| 类型 | 说明 | 152| ---------------- | ---------------- | 153| Promise\<Object> | Promise对象,返回任务函数的执行结果。 | 154 155**错误码:** 156 157以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 158 159| 错误码ID | 错误信息 | 160| -------- | ------------------------------------------- | 161| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 162| 10200006 | An exception occurred during serialization. | 163| 10200014 | The function is not marked as concurrent. | 164| 10200051 | The periodic task cannot be executed again. | 165 166**示例:** 167 168```ts 169@Concurrent 170function printArgs(args: number): number { 171 console.info("printArgs: " + args); 172 return args; 173} 174 175let task1: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 176let task2: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 177let task3: taskpool.Task = new taskpool.Task(printArgs, 300); // 300: test number 178taskpool.execute(task1, taskpool.Priority.LOW).then((value: Object) => { 179 console.info("taskpool result1: " + value); 180}); 181taskpool.execute(task2, taskpool.Priority.MEDIUM).then((value: Object) => { 182 console.info("taskpool result2: " + value); 183}); 184taskpool.execute(task3, taskpool.Priority.HIGH).then((value: Object) => { 185 console.info("taskpool result3: " + value); 186}); 187``` 188 189 190## taskpool.execute<sup>13+</sup> 191 192execute<A extends Array\<Object>, R>(task: GenericsTask<A, R>, priority?: Priority): Promise\<R> 193 194校验并发函数的参数类型和返回类型后,将创建好的泛型任务放入taskpool内部任务队列。 195 196**系统能力:** SystemCapability.Utils.Lang 197 198**原子化服务API**:从API version 13 开始,该接口支持在原子化服务中使用。 199 200**参数:** 201 202| 参数名 | 类型 | 必填 | 说明 | 203| -------- | --------------------- | ---- | ---------------------------------------- | 204| task | [GenericsTask](#genericstask13) | 是 | 需要在任务池中执行的泛型任务。 | 205| priority | [Priority](#priority) | 否 | 等待执行的任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 206 207**返回值:** 208 209| 类型 | 说明 | 210| ---------------- | ---------------- | 211| Promise\<R> | Promise对象,返回任务函数的执行结果。 | 212 213**错误码:** 214 215以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 216 217| 错误码ID | 错误信息 | 218| -------- | ------------------------------------------- | 219| 401 | Parameter error. Possible causes: 1.Incorrect parameter types; 2.Parameter verification failed. | 220| 10200006 | An exception occurred during serialization. | 221| 10200014 | The function is not marked as concurrent. | 222| 10200051 | The periodic task cannot be executed again. | 223 224**示例:** 225 226```ts 227@Concurrent 228function printArgs(args: number): number { 229 console.info("printArgs: " + args); 230 return args; 231} 232 233let task1: taskpool.Task = new taskpool.GenericsTask<[number], number>(printArgs, 100); // 100: test number 234let task2: taskpool.Task = new taskpool.GenericsTask<[number], number>(printArgs, 200); // 200: test number 235let task3: taskpool.Task = new taskpool.GenericsTask<[number], number>(printArgs, 300); // 300: test number 236taskpool.execute<[number], number>(task1, taskpool.Priority.LOW).then((value: number) => { 237 console.info("taskpool result1: " + value); 238}); 239taskpool.execute<[number], number>(task2, taskpool.Priority.MEDIUM).then((value: number) => { 240 console.info("taskpool result2: " + value); 241}); 242taskpool.execute<[number], number>(task3, taskpool.Priority.HIGH).then((value: number) => { 243 console.info("taskpool result3: " + value); 244}); 245``` 246 247 248## taskpool.execute<sup>10+</sup> 249 250execute(group: TaskGroup, priority?: Priority): Promise<Object[]> 251 252将创建好的任务组放入taskpool内部任务队列,任务组中的任务不会立即执行,而是等待分发到工作线程执行。任务组中任务全部执行完成后,结果数组统一返回。当前执行模式适用于执行一组有关联的任务。 253 254**系统能力:** SystemCapability.Utils.Lang 255 256**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 257 258**参数:** 259 260| 参数名 | 类型 | 必填 | 说明 | 261| --------- | --------------------------- | ---- | -------------------------------------------------------------- | 262| group | [TaskGroup](#taskgroup10) | 是 | 需要在任务池中执行的任务组。 | 263| priority | [Priority](#priority) | 否 | 等待执行的任务组的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 264 265**返回值:** 266 267| 类型 | 说明 | 268| ---------------- | ---------------------------------- | 269| Promise\<Object[]> | Promise对象数组,返回任务函数的执行结果。 | 270 271**错误码:** 272 273以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 274 275| 错误码ID | 错误信息 | 276| -------- | ------------------------------------------- | 277| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 278| 10200006 | An exception occurred during serialization. | 279 280**示例:** 281 282```ts 283@Concurrent 284function printArgs(args: number): number { 285 console.info("printArgs: " + args); 286 return args; 287} 288 289let taskGroup1: taskpool.TaskGroup = new taskpool.TaskGroup(); 290taskGroup1.addTask(printArgs, 10); // 10: test number 291taskGroup1.addTask(printArgs, 20); // 20: test number 292taskGroup1.addTask(printArgs, 30); // 30: test number 293 294let taskGroup2: taskpool.TaskGroup = new taskpool.TaskGroup(); 295let task1: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 296let task2: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 297let task3: taskpool.Task = new taskpool.Task(printArgs, 300); // 300: test number 298taskGroup2.addTask(task1); 299taskGroup2.addTask(task2); 300taskGroup2.addTask(task3); 301taskpool.execute(taskGroup1).then((res: Array<Object>) => { 302 console.info("taskpool execute res is:" + res); 303}); 304taskpool.execute(taskGroup2).then((res: Array<Object>) => { 305 console.info("taskpool execute res is:" + res); 306}); 307``` 308 309## taskpool.executeDelayed<sup>11+</sup> 310 311executeDelayed(delayTime: number, task: Task, priority?: Priority): Promise\<Object> 312 313延时执行任务。当前执行模式可以设置任务优先级和尝试调用cancel进行任务取消。该任务不可以是任务组任务、串行队列任务和周期任务。若该任务非长时任务,可以多次调用executeDelayed执行,长时任务仅支持执行一次。 314 315**系统能力:** SystemCapability.Utils.Lang 316 317**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 318 319**参数:** 320 321| 参数名 | 类型 | 必填 | 说明 | 322| ----------- | ------------- | ---- | -------------------- | 323| delayTime | number | 是 | 延时时间。单位为ms。 | 324| task | [Task](#task) | 是 | 需要延时执行的任务。 | 325| priority | [Priority](#priority) | 否 | 延时执行的任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 326 327**返回值:** 328 329| 类型 | 说明 | 330| ---------------- | ---------------------------------- | 331| Promise\<Object> | Promise对象,返回任务函数的执行结果。 | 332 333**错误码:** 334 335以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 336 337| 错误码ID | 错误信息 | 338| --------- | -------------------------------- | 339| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 340| 10200006 | An exception occurred during serialization. | 341| 10200014 | The function is not marked as concurrent. | 342| 10200028 | The delayTime is less than zero. | 343| 10200051 | The periodic task cannot be executed again. | 344 345**示例:** 346 347```ts 348// import BusinessError 349import { BusinessError } from '@kit.BasicServicesKit' 350 351@Concurrent 352function printArgs(args: number): void { 353 console.info("printArgs: " + args); 354} 355 356let t: number = Date.now(); 357console.info("taskpool start time is: " + t); 358let task: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 359taskpool.executeDelayed(1000, task).then(() => { // 1000:delayTime is 1000ms 360 console.info("taskpool execute success"); 361}).catch((e: BusinessError) => { 362 console.error(`taskpool execute: Code: ${e.code}, message: ${e.message}`); 363}) 364``` 365 366 367## taskpool.executeDelayed<sup>13+</sup> 368 369executeDelayed<A extends Array\<Object>, R>(delayTime: number, task: GenericsTask\<A, R>, priority?: Priority): Promise\<R> 370 371校验并发函数的参数类型和返回类型后,延时执行泛型任务。 372 373**系统能力:** SystemCapability.Utils.Lang 374 375**原子化服务API**:从API version 13 开始,该接口支持在原子化服务中使用。 376 377**参数:** 378 379| 参数名 | 类型 | 必填 | 说明 | 380| ----------- | ------------- | ---- | -------------------- | 381| delayTime | number | 是 | 延时时间。单位为ms。 | 382| task | [GenericsTask](#genericstask13) | 是 | 需要延时执行的泛型任务。 | 383| priority | [Priority](#priority) | 否 | 延时执行的任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 384 385**返回值:** 386 387| 类型 | 说明 | 388| ---------------- | ---------------------------------- | 389| Promise\<R> | Promise对象,返回任务函数的执行结果。 | 390 391**错误码:** 392 393以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 394 395| 错误码ID | 错误信息 | 396| --------- | -------------------------------- | 397| 401 | Parameter error. Possible causes: 1.Incorrect parameter types; 2.Parameter verification failed. | 398| 10200028 | The delayTime is less than zero. | 399| 10200051 | The periodic task cannot be executed again. | 400 401**示例:** 402 403```ts 404// import BusinessError 405import { BusinessError } from '@kit.BasicServicesKit' 406 407@Concurrent 408function printArgs(args: number): string { 409 console.info("printArgs: " + args); 410 return "success"; 411} 412 413let task: taskpool.Task = new taskpool.GenericsTask<[number], string>(printArgs, 100); // 100: test number 414taskpool.executeDelayed<[number], string>(1000, task).then((res: string) => { // 1000:delayTime is 1000ms 415 console.info("taskpool execute success"); 416}).catch((e: BusinessError) => { 417 console.error(`taskpool execute: Code: ${e.code}, message: ${e.message}`); 418}) 419``` 420 421 422## taskpool.executePeriodically<sup>12+</sup> 423 424executePeriodically(period: number, task: Task, priority?: Priority): void 425 426周期执行任务,每隔period时长执行一次任务。当前执行模式支持设置任务优先级和调用cancel取消任务周期执行。周期任务不可以是任务组任务和串行队列任务,不可以再次调用执行接口,不可以拥有依赖关系。 427 428 429**系统能力:** SystemCapability.Utils.Lang 430 431**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 432 433**参数:** 434 435| 参数名 | 类型 | 必填 | 说明 | 436| ----------- | ------------- | ----- | -------------------- | 437| period | number | 是 | 周期时长。单位为ms。 | 438| task | [Task](#task) | 是 | 需要周期执行的任务。 | 439| priority | [Priority](#priority) | 否 | 周期执行的任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 440 441 442**错误码:** 443 444以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 445 446| 错误码ID | 错误信息 | 447| ---------- | -------------------------------- | 448| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 449| 10200006 | An exception occurred during serialization. | 450| 10200014 | The function is not marked as concurrent. | 451| 10200028 | The period is less than zero. | 452| 10200050 | The concurrent task has been executed and cannot be executed periodically. | 453 454 455**示例:** 456 457```ts 458@Concurrent 459function printArgs(args: number): void { 460 console.info("printArgs: " + args); 461} 462 463@Concurrent 464function testExecutePeriodically(args: number): void { 465 let t = Date.now(); 466 while ((Date.now() - t) < args) { 467 continue; 468 } 469 taskpool.Task.sendData(args); // 向宿主线程发送消息 470} 471 472function printResult(data: number): void { 473 console.info("taskpool: data is: " + data); 474} 475 476function taskpoolTest() { 477 try { 478 let task: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 479 taskpool.executePeriodically(1000, task); // 1000: period is 1000ms 480 } catch (e) { 481 console.error(`taskpool execute-1: Code: ${e.code}, message: ${e.message}`); 482 } 483 484 try { 485 let periodicTask: taskpool.Task = new taskpool.Task(testExecutePeriodically, 200); // 200: test number 486 periodicTask.onReceiveData(printResult); 487 taskpool.executePeriodically(1000, periodicTask); // 1000: period is 1000ms 488 } catch (e) { 489 console.error(`taskpool execute-2: Code: ${e.code}, message: ${e.message}`); 490 } 491} 492 493taskpoolTest(); 494``` 495 496 497## taskpool.executePeriodically<sup>13+</sup> 498 499executePeriodically<A extends Array\<Object>, R>(period: number, task: GenericsTask\<A, R>, priority?: Priority): void 500 501校验并发函数的参数类型和返回类型后,周期执行泛型任务,每隔period时长执行一次泛型任务。 502 503 504**系统能力:** SystemCapability.Utils.Lang 505 506**原子化服务API**:从API version 13 开始,该接口支持在原子化服务中使用。 507 508**参数:** 509 510| 参数名 | 类型 | 必填 | 说明 | 511| ----------- | ------------- | ----- | -------------------- | 512| period | number | 是 | 周期时长。单位为ms。 | 513| task | [GenericsTask](#genericstask13) | 是 | 需要周期执行的泛型任务。 | 514| priority | [Priority](#priority) | 否 | 周期执行的任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 515 516 517**错误码:** 518 519以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 520 521| 错误码ID | 错误信息 | 522| ---------- | -------------------------------- | 523| 401 | Parameter error. Possible causes: 1.Incorrect parameter types; 2.Parameter verification failed. | 524| 10200006 | An exception occurred during serialization. | 525| 10200014 | The function is not marked as concurrent. | 526| 10200028 | The period is less than zero. | 527| 10200050 | The concurrent task has been executed and cannot be executed periodically. | 528 529 530**示例:** 531 532```ts 533@Concurrent 534function printArgs(args: number): void { 535 console.info("printArgs: " + args); 536} 537 538@Concurrent 539function testExecutePeriodically(args: number): void { 540 let t = Date.now(); 541 while ((Date.now() - t) < args) { 542 continue; 543 } 544 taskpool.Task.sendData(args); // 向宿主线程发送消息 545} 546 547function printResult(data: number): void { 548 console.info("taskpool: data is: " + data); 549} 550 551function taskpoolTest() { 552 try { 553 let task: taskpool.Task = new taskpool.GenericsTask<[number], void>(printArgs, 100); // 100: test number 554 taskpool.executePeriodically<[number], void>(1000, task); // 1000: period is 1000ms 555 } catch (e) { 556 console.error(`taskpool execute-1: Code: ${e.code}, message: ${e.message}`); 557 } 558 559 try { 560 let periodicTask: taskpool.Task = new taskpool.GenericsTask<[number], void>(testExecutePeriodically, 200); // 200: test number 561 periodicTask.onReceiveData(printResult); 562 taskpool.executePeriodically<[number], void>(1000, periodicTask); // 1000: period is 1000ms 563 } catch (e) { 564 console.error(`taskpool execute-2: Code: ${e.code}, message: ${e.message}`); 565 } 566} 567 568taskpoolTest(); 569``` 570 571 572## taskpool.cancel 573 574cancel(task: Task): void 575 576取消任务池中的任务。当任务在taskpool等待队列中,取消该任务后该任务将不再执行,并返回undefined作为结果;当任务已经在taskpool工作线程执行,取消该任务并不影响任务继续执行,执行结果在catch分支返回,搭配isCanceled使用可以对任务取消行为作出响应。taskpool.cancel对其之前的taskpool.execute/taskpool.executeDelayed生效。 577 578**系统能力:** SystemCapability.Utils.Lang 579 580**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 581 582**参数:** 583 584| 参数名 | 类型 | 必填 | 说明 | 585| ------ | ------------- | ---- | -------------------- | 586| task | [Task](#task) | 是 | 需要取消执行的任务。 | 587 588**错误码:** 589 590以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 591 592| 错误码ID | 错误信息 | 593| -------- | -------------------------------------------- | 594| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 595| 10200015 | The task to cancel does not exist. | 596 597从API version10开始,此接口调用时不再涉及上报错误码10200016。 598 599**正在执行的任务取消示例:** 600 601```ts 602@Concurrent 603function inspectStatus(arg: number): number { 604 // 第一次检查任务是否已经取消并作出响应 605 if (taskpool.Task.isCanceled()) { 606 console.info("task has been canceled before 2s sleep."); 607 return arg + 2; 608 } 609 // 2s sleep 610 let t: number = Date.now(); 611 while (Date.now() - t < 2000) { 612 continue; 613 } 614 // 第二次检查任务是否已经取消并作出响应 615 if (taskpool.Task.isCanceled()) { 616 console.info("task has been canceled after 2s sleep."); 617 return arg + 3; 618 } 619 return arg + 1; 620} 621 622function concurrentFunc() { 623 let task1: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 624 let task2: taskpool.Task = new taskpool.Task(inspectStatus, 200); // 200: test number 625 let task3: taskpool.Task = new taskpool.Task(inspectStatus, 300); // 300: test number 626 let task4: taskpool.Task = new taskpool.Task(inspectStatus, 400); // 400: test number 627 let task5: taskpool.Task = new taskpool.Task(inspectStatus, 500); // 500: test number 628 let task6: taskpool.Task = new taskpool.Task(inspectStatus, 600); // 600: test number 629 taskpool.execute(task1).then((res: Object)=>{ 630 console.info("taskpool test result: " + res); 631 }); 632 taskpool.execute(task2); 633 taskpool.execute(task3); 634 taskpool.execute(task4); 635 taskpool.execute(task5); 636 taskpool.execute(task6); 637 // 1s后取消task 638 setTimeout(()=>{ 639 try { 640 taskpool.cancel(task1); 641 } catch (e) { 642 console.error(`taskpool: cancel error code: ${e.code}, info: ${e.message}`); 643 } 644 }, 1000); 645} 646 647concurrentFunc(); 648``` 649 650## taskpool.cancel<sup>10+</sup> 651 652cancel(group: TaskGroup): void 653 654取消任务池中的任务组。当一个任务组的任务未全部执行结束时取消任务组,返回undefined作为任务组结果。 655 656**系统能力:** SystemCapability.Utils.Lang 657 658**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 659 660**参数:** 661 662| 参数名 | 类型 | 必填 | 说明 | 663| ------- | ----------------------- | ---- | -------------------- | 664| group | [TaskGroup](#taskgroup10) | 是 | 需要取消执行的任务组。 | 665 666**错误码:** 667 668以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 669 670| 错误码ID | 错误信息 | 671| -------- | ------------------------------------------------------- | 672| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 673| 10200018 | The task group to cancel does not exist. | 674 675**示例:** 676 677```ts 678@Concurrent 679function printArgs(args: number): number { 680 let t: number = Date.now(); 681 while (Date.now() - t < 2000) { 682 continue; 683 } 684 console.info("printArgs: " + args); 685 return args; 686} 687 688function concurrentFunc() { 689 let taskGroup1: taskpool.TaskGroup = new taskpool.TaskGroup(); 690 taskGroup1.addTask(printArgs, 10); // 10: test number 691 let taskGroup2: taskpool.TaskGroup = new taskpool.TaskGroup(); 692 taskGroup2.addTask(printArgs, 100); // 100: test number 693 taskpool.execute(taskGroup1).then((res: Array<Object>)=>{ 694 console.info("taskGroup1 res is:" + res); 695 }); 696 taskpool.execute(taskGroup2).then((res: Array<Object>)=>{ 697 console.info("taskGroup2 res is:" + res); 698 }); 699 setTimeout(()=>{ 700 try { 701 taskpool.cancel(taskGroup2); 702 } catch (e) { 703 console.error(`taskpool: cancel error code: ${e.code}, info: ${e.message}`); 704 } 705 }, 1000); 706} 707 708concurrentFunc(); 709``` 710 711## taskpool.terminateTask<sup>12+</sup> 712 713terminateTask(longTask: LongTask): void 714 715中止任务池中的长时任务,在长时任务执行完成后调用。中止后,执行长时任务的线程可能会被回收。 716 717**系统能力:** SystemCapability.Utils.Lang 718 719**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 720 721**参数:** 722 723| 参数名 | 类型 | 必填 | 说明 | 724| ------ | ------------- | ---- | -------------------- | 725| longTask | [LongTask](#longtask12) | 是 | 需要中止的长时任务。 | 726 727**错误码:** 728 729以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 730 731| 错误码ID | 错误信息 | 732| -------- | -------- | 733| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 734 735**示例:** 736 737```ts 738@Concurrent 739function longTask(arg: number): number { 740 let t: number = Date.now(); 741 while (Date.now() - t < arg) { 742 continue; 743 } 744 console.info("longTask has been executed."); 745 return arg; 746} 747 748function concurrentFunc() { 749 let task1: taskpool.LongTask = new taskpool.LongTask(longTask, 1000); // 1000: sleep time 750 taskpool.execute(task1).then((res: Object)=>{ 751 taskpool.terminateTask(task1); 752 console.info("taskpool longTask result: " + res); 753 }); 754} 755 756concurrentFunc(); 757``` 758 759## taskpool.isConcurrent<sup>12+</sup> 760 761isConcurrent(func: Function): boolean 762 763检查函数是否为并发函数。 764 765**系统能力:** SystemCapability.Utils.Lang 766 767**原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 768 769**参数:** 770 771| 参数名 | 类型 | 必填 | 说明 | 772| ------ | ------------- | ---- | -------------------- | 773| func | Function | 是 | 需要检查的函数。 | 774 775**返回值:** 776 777| 类型 | 说明 | 778| ------- | ------------------------------------ | 779| boolean | 如果被检查函数标注了[@Concurrent装饰器](../../arkts-utils/taskpool-introduction.md#concurrent装饰器),返回true,否则返回false。 | 780 781**错误码:** 782 783以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 784 785| 错误码ID | 错误信息 | 786| -------- | -------- | 787| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 788 789**示例:** 790 791```ts 792@Concurrent 793function test() {} 794 795let result: Boolean = taskpool.isConcurrent(test) 796console.info("result is: " + result) 797``` 798 799## taskpool.getTaskPoolInfo<sup>10+</sup> 800 801getTaskPoolInfo(): TaskPoolInfo 802 803获取任务池内部信息,包含线程信息和任务信息。 804 805**系统能力:** SystemCapability.Utils.Lang 806 807**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 808 809**返回值:** 810 811| 类型 | 说明 | 812| ----------------------------------- | ------------------ | 813| [TaskPoolInfo](#taskpoolinfo10) | 任务池的内部信息。 | 814 815**示例:** 816 817```ts 818let taskpoolInfo: taskpool.TaskPoolInfo = taskpool.getTaskPoolInfo(); 819``` 820 821## Priority 822 823表示所创建任务(Task)执行时的优先级。工作线程优先级跟随任务优先级同步更新,对应关系参考[QoS等级定义](../../napi/qos-guidelines.md#qos等级定义)。 824 825**系统能力:** SystemCapability.Utils.Lang 826 827| 名称 | 值 | 说明 | 828| -------- | -------- | -------- | 829| HIGH | 0 | 任务为高优先级。<br/>**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 | 830| MEDIUM | 1 | 任务为中优先级。<br/>**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 | 831| LOW | 2 | 任务为低优先级。<br/>**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 | 832| IDLE<sup>12+</sup> | 3 | 任务为后台任务。<br/>**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 | 833 834**示例:** 835 836```ts 837@Concurrent 838function printArgs(args: number): number { 839 let t: number = Date.now(); 840 while (Date.now() - t < 1000) { // 1000: delay 1s 841 continue; 842 } 843 console.info("printArgs: " + args); 844 return args; 845} 846 847let allCount = 100; // 100: test number 848let taskArray: Array<taskpool.Task> = []; 849// 创建400个任务并添加至taskArray 850for (let i: number = 0; i < allCount; i++) { 851 let task1: taskpool.Task = new taskpool.Task(printArgs, i); 852 taskArray.push(task1); 853 let task2: taskpool.Task = new taskpool.Task(printArgs, i * 10); // 10: test number 854 taskArray.push(task2); 855 let task3: taskpool.Task = new taskpool.Task(printArgs, i * 100); // 100: test number 856 taskArray.push(task3); 857 let task4: taskpool.Task = new taskpool.Task(printArgs, i * 1000); // 1000: test number 858 taskArray.push(task4); 859} 860 861// 从taskArray中获取不同的任务并给定不同优先级执行 862for (let i: number = 0; i < taskArray.length; i+=4) { // 4: 每次执行4个任务,循环取任务时需后移4项,确保执行的是不同的任务 863 taskpool.execute(taskArray[i], taskpool.Priority.HIGH); 864 taskpool.execute(taskArray[i + 1], taskpool.Priority.LOW); 865 taskpool.execute(taskArray[i + 2], taskpool.Priority.MEDIUM); 866 taskpool.execute(taskArray[i + 3], taskpool.Priority.IDLE); 867} 868``` 869 870## Task 871 872表示任务。使用[constructor](#constructor)方法构造Task。任务可以多次执行或放入任务组执行或放入串行队列执行或添加依赖关系执行。 873 874### 属性 875 876**系统能力:** SystemCapability.Utils.Lang 877 878**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 879 880| 名称 | 类型 | 可读 | 可写 | 说明 | 881| -------------------- | --------- | ---- | ---- | ------------------------------------------------------------ | 882| function | Function | 是 | 是 | 创建任务时需要传入的函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 883| arguments | Object[] | 是 | 是 | 创建任务传入函数所需的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。 | 884| name<sup>11+</sup> | string | 是 | 否 | 创建任务时指定的任务名称。 | 885| totalDuration<sup>11+</sup> | number | 是 | 否 | 执行任务总耗时。 | 886| ioDuration<sup>11+</sup> | number | 是 | 否 | 执行任务异步IO耗时。 | 887| cpuDuration<sup>11+</sup> | number | 是 | 否 | 执行任务CPU耗时。 | 888 889### constructor 890 891constructor(func: Function, ...args: Object[]) 892 893Task的构造函数。 894 895**系统能力:** SystemCapability.Utils.Lang 896 897**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 898 899**参数:** 900 901| 参数名 | 类型 | 必填 | 说明 | 902| ------ | --------- | ---- | -------------------------------------------------------------------- | 903| func | Function | 是 | 执行的逻辑需要传入函数,必须使用[@Concurrent装饰器](../../arkts-utils/taskpool-introduction.md#concurrent装饰器)装饰,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 904| args | Object[] | 否 | 任务执行传入函数的入参,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 905 906**错误码:** 907 908以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 909 910| 错误码ID | 错误信息 | 911| -------- | --------------------------------------- | 912| 401 | The input parameters are invalid. | 913| 10200014 | The function is not marked as concurrent. | 914 915**示例:** 916 917```ts 918@Concurrent 919function printArgs(args: number): number { 920 console.info("printArgs: " + args); 921 return args; 922} 923 924let task: taskpool.Task = new taskpool.Task(printArgs, "this is my first Task"); 925``` 926 927### constructor<sup>11+</sup> 928 929constructor(name: string, func: Function, ...args: Object[]) 930 931Task的构造函数,可以指定任务名称。 932 933**系统能力:** SystemCapability.Utils.Lang 934 935**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 936 937**参数:** 938 939| 参数名 | 类型 | 必填 | 说明 | 940| ------ | -------- | ---- | ------------------------------------------------------------ | 941| name | string | 是 | 任务名称。 | 942| func | Function | 是 | 执行的逻辑需要传入函数,必须使用[@Concurrent装饰器](../../arkts-utils/taskpool-introduction.md#concurrent装饰器)装饰,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 943| args | Object[] | 否 | 任务执行传入函数的入参,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 944 945**错误码:** 946 947以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 948 949| 错误码ID | 错误信息 | 950| -------- | --------------------------------------- | 951| 401 | The input parameters are invalid. | 952| 10200014 | The function is not marked as concurrent. | 953 954**示例:** 955 956```ts 957@Concurrent 958function printArgs(args: string): string { 959 console.info("printArgs: " + args); 960 return args; 961} 962 963let taskName: string = "taskName"; 964let task: taskpool.Task = new taskpool.Task(taskName, printArgs, "this is my first Task"); 965let name: string = task.name; 966``` 967 968### isCanceled<sup>10+</sup> 969 970static isCanceled(): boolean 971 972检查当前正在运行的任务是否已取消。使用该方法前需要先构造Task。 973 974**系统能力:** SystemCapability.Utils.Lang 975 976**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 977 978**返回值:** 979 980| 类型 | 说明 | 981| ------- | ------------------------------------ | 982| boolean | 如果当前正在运行的任务被取消返回true,未被取消返回false。| 983 984**示例:** 985 986```ts 987@Concurrent 988function inspectStatus(arg: number): number { 989 // do something 990 if (taskpool.Task.isCanceled()) { 991 console.info("task has been canceled."); 992 // do something 993 return arg + 1; 994 } 995 // do something 996 return arg; 997} 998``` 999 1000> **说明:** 1001> 1002> isCanceled方法需要和taskpool.cancel方法搭配使用,如果不调用cancel方法,isCanceled方法默认返回false。 1003 1004**示例:** 1005 1006```ts 1007@Concurrent 1008function inspectStatus(arg: number): number { 1009 // 第一次检查任务是否已经取消并作出响应 1010 if (taskpool.Task.isCanceled()) { 1011 console.info("task has been canceled before 2s sleep."); 1012 return arg + 2; 1013 } 1014 // 延时2s 1015 let t: number = Date.now(); 1016 while (Date.now() - t < 2000) { 1017 continue; 1018 } 1019 // 第二次检查任务是否已经取消并作出响应 1020 if (taskpool.Task.isCanceled()) { 1021 console.info("task has been canceled after 2s sleep."); 1022 return arg + 3; 1023 } 1024 return arg + 1; 1025} 1026 1027let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 1028taskpool.execute(task).then((res: Object)=>{ 1029 console.info("taskpool test result: " + res); 1030}).catch((err: string) => { 1031 console.error("taskpool test occur error: " + err); 1032}); 1033// 不调用cancel,isCanceled()默认返回false,task执行的结果为101 1034``` 1035 1036### setTransferList<sup>10+</sup> 1037 1038setTransferList(transfer?: ArrayBuffer[]): void 1039 1040设置任务的传输列表。使用该方法前需要先构造Task。不调用该接口,则传给任务的数据中的ArrayBuffer默认transfer转移。 1041 1042> **说明:** 1043> 1044> 此接口可以设置任务池中ArrayBuffer的transfer列表,transfer列表中的ArrayBuffer对象在传输时不会复制buffer内容到工作线程而是转移buffer控制权至工作线程,传输后当前的ArrayBuffer失效。若ArrayBuffer为空,则不会transfer转移。 1045 1046**系统能力:** SystemCapability.Utils.Lang 1047 1048**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1049 1050**参数:** 1051 1052| 参数名 | 类型 | 必填 | 说明 | 1053| -------- | ------------- | ---- | --------------------------------------------- | 1054| transfer | ArrayBuffer[] | 否 | 可传输对象是ArrayBuffer的实例对象,默认为空数组。 | 1055 1056**错误码:** 1057 1058以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1059 1060| 错误码ID | 错误信息 | 1061| -------- | -------------------------------------------------------------- | 1062| 401 | Parameter error. Possible causes: 1. Incorrect parameter types; 2. Parameter verification failed. | 1063| 10200029 | An ArrayBuffer cannot be set as both a transfer list and a clone list. | 1064 1065**示例:** 1066 1067```ts 1068@Concurrent 1069function testTransfer(arg1: ArrayBuffer, arg2: ArrayBuffer): number { 1070 console.info("testTransfer arg1 byteLength: " + arg1.byteLength); 1071 console.info("testTransfer arg2 byteLength: " + arg2.byteLength); 1072 return 100; 1073} 1074 1075let buffer: ArrayBuffer = new ArrayBuffer(8); 1076let view: Uint8Array = new Uint8Array(buffer); 1077let buffer1: ArrayBuffer = new ArrayBuffer(16); 1078let view1: Uint8Array = new Uint8Array(buffer1); 1079 1080console.info("testTransfer view byteLength: " + view.byteLength); 1081console.info("testTransfer view1 byteLength: " + view1.byteLength); 1082// 执行结果为: 1083// testTransfer view byteLength: 8 1084// testTransfer view1 byteLength: 16 1085 1086let task: taskpool.Task = new taskpool.Task(testTransfer, view, view1); 1087task.setTransferList([view.buffer, view1.buffer]); 1088taskpool.execute(task).then((res: Object)=>{ 1089 console.info("test result: " + res); 1090}).catch((e: string)=>{ 1091 console.error("test catch: " + e); 1092}) 1093console.info("testTransfer view2 byteLength: " + view.byteLength); 1094console.info("testTransfer view3 byteLength: " + view1.byteLength); 1095// 经过transfer转移之后值为0,执行结果为: 1096// testTransfer view2 byteLength: 0 1097// testTransfer view3 byteLength: 0 1098``` 1099 1100 1101### setCloneList<sup>11+</sup> 1102 1103setCloneList(cloneList: Object[] | ArrayBuffer[]): void 1104 1105设置任务的拷贝列表。使用该方法前需要先构造Task。 1106 1107> **说明:** 1108> 1109> 需搭配[@Sendable装饰器](../../arkts-utils/arkts-sendable.md#sendable装饰器)使用,否则会抛异常。 1110 1111**系统能力:** SystemCapability.Utils.Lang 1112 1113**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1114 1115**参数:** 1116 1117| 参数名 | 类型 | 必填 | 说明 | 1118| --------- | ------------------------ | ---- | --------------------------------------------- | 1119| cloneList | Object[] \| ArrayBuffer[] | 是 | - 传入数组的类型必须为[Sendable支持的数据类型](../../arkts-utils/arkts-sendable.md#sendable支持的数据类型)或ArrayBuffer。<br/>- 所有传入cloneList的对象持有的[Sendable class](../../arkts-utils/arkts-sendable.md#sendable-class)实例或ArrayBuffer类型对象,在线程间传输的行为都会变成拷贝传递,即修改传输后的对象不会对原有对象产生任何影响。 | 1120 1121**错误码:** 1122 1123以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1124 1125| 错误码ID | 错误信息 | 1126| -------- | -------------------------------------------------------------- | 1127| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 1128| 10200029 | An ArrayBuffer cannot be set as both a transfer list and a clone list. | 1129 1130**示例:** 1131 1132```ts 1133// sendable.ets 1134// 定义两个Sendable class:BaseClass及其子类DeriveClass 1135@Sendable 1136export class BaseClass { 1137 private str: string = "sendable: BaseClass"; 1138 static num :number = 10; 1139 str1: string = "sendable: this is BaseClass's string"; 1140 num1: number = 5; 1141 isDone1: boolean = false; 1142 1143 private fibonacciRecursive(n: number): number { 1144 if (n <= 1) { 1145 return n; 1146 } else { 1147 return this.fibonacciRecursive(n - 1) + this.fibonacciRecursive(n - 2); 1148 } 1149 } 1150 1151 private privateFunc(num: number): number{ 1152 let res: number = this.fibonacciRecursive(num); 1153 console.info("sendable: BaseClass privateFunc res is: " + res); 1154 return res; 1155 } 1156 1157 publicFunc(num: number): number { 1158 return this.privateFunc(num); 1159 } 1160 1161 get GetNum(): number { 1162 return this.num1; 1163 } 1164 set SetNum(num: number) { 1165 this.num1 = num; 1166 } 1167 1168 constructor(){ 1169 console.info(this.str); 1170 this.isDone1 = true; 1171 } 1172} 1173 1174@Sendable 1175export class DeriveClass extends BaseClass { 1176 name: string = "sendable: this is DeriveClass"; 1177 printName() { 1178 console.info(this.name); 1179 } 1180 constructor() { 1181 super(); 1182 } 1183} 1184``` 1185 1186<!--code_no_check--> 1187```ts 1188// index.ets 1189// 宿主线程(这里的宿主线程为UI主线程)调用taskpool,在taskpool线程中调用BaseClass和DeriveClass的方法、访问对应属性 1190import { taskpool } from '@kit.ArkTS' 1191import { BusinessError } from '@kit.BasicServicesKit' 1192import { BaseClass, DeriveClass } from './sendable' 1193 1194@Concurrent 1195function testFunc(arr: Array<BaseClass>, num: number): number { 1196 let baseInstance1 = arr[0]; 1197 console.info("sendable: str1 is: " + baseInstance1.str1); 1198 baseInstance1.SetNum = 100; 1199 console.info("sendable: num1 is: " + baseInstance1.GetNum); 1200 console.info("sendable: isDone1 is: " + baseInstance1.isDone1); 1201 // 获取斐波那契数列第num项的结果 1202 let res: number = baseInstance1.publicFunc(num); 1203 return res; 1204} 1205 1206@Concurrent 1207function printLog(arr: Array<DeriveClass>): void { 1208 let deriveInstance = arr[0]; 1209 deriveInstance.printName(); 1210} 1211 1212@Entry 1213@Component 1214struct Index { 1215 @State message: string = 'Hello World' 1216 1217 build() { 1218 Row() { 1219 Column() { 1220 Text(this.message) 1221 .fontSize(50) 1222 .fontWeight(FontWeight.Bold) 1223 Button() { 1224 Text("TaskPool Test") 1225 }.onClick(() => { 1226 // task1访问调用BaseClass.str1/BaseClass.SetNum/BaseClass.GetNum/BaseClass.isDone1/BaseClass.publicFunc 1227 let baseInstance1: BaseClass = new BaseClass(); 1228 let array1 = new Array<BaseClass>(); 1229 array1.push(baseInstance1); 1230 let task1 = new taskpool.Task(testFunc, array1, 10); 1231 task1.setCloneList(array1); 1232 taskpool.execute(task1).then((res: Object) => { 1233 console.info("sendable: task1 res is: " + res); 1234 }).catch((e:BusinessError) => { 1235 console.error(`sendable: task1 execute Code is ${e.code}, message is ${e.message}`); 1236 }) 1237 1238 // task2调用DeriveClass.printName 1239 let deriveInstance: DeriveClass = new DeriveClass(); 1240 let array2 = new Array<DeriveClass>(); 1241 array2.push(deriveInstance); 1242 let task2 = new taskpool.Task(printLog, array2); 1243 task2.setCloneList(array2); 1244 taskpool.execute(task2).then(() => { 1245 console.info("sendable: task2 execute success"); 1246 }).catch((e:BusinessError) => { 1247 console.error(`sendable: task2 execute Code is ${e.code}, message is ${e.message}`); 1248 }) 1249 }) 1250 .height('15%') 1251 .width('30%') 1252 } 1253 .width('100%') 1254 } 1255 .height('100%') 1256 } 1257} 1258``` 1259 1260 1261### sendData<sup>11+</sup> 1262 1263static sendData(...args: Object[]): void 1264 1265在任务执行过程中向宿主线程发送消息并触发回调。使用该方法前需要先构造Task。 1266 1267> **说明:** 1268> 1269> - 该接口在taskpool的线程中调用。 1270> - 避免在回调函数中使用该方法。 1271> - 调用该接口时确保处理数据的回调函数在宿主线程已注册。 1272 1273**系统能力:** SystemCapability.Utils.Lang 1274 1275**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1276 1277**参数:** 1278 1279| 参数名 | 类型 | 必填 | 说明 | 1280| -------- | ------------- | ---- | ------------------------------------------------- | 1281| args | Object[] | 否 | 可传输对象默认转移,作为回调函数的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 1282 1283**错误码:** 1284 1285以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1286 1287| 错误码ID | 错误信息 | 1288| -------- | --------------------------------------- | 1289| 401 | The input parameters are invalid. | 1290| 10200006 | An exception occurred during serialization. | 1291| 10200022 | The function is not called in the TaskPool thread. | 1292| 10200023 | The function is not called in the concurrent function. | 1293| 10200024 | The callback is not registered on the host side. | 1294 1295**示例:** 1296 1297```ts 1298@Concurrent 1299function sendDataTest(num: number): number { 1300 let res: number = num * 10; 1301 taskpool.Task.sendData(res); 1302 return num; 1303} 1304 1305function printLog(data: number): void { 1306 console.info("taskpool: data is: " + data); 1307} 1308 1309async function taskpoolTest(): Promise<void> { 1310 try { 1311 let task: taskpool.Task = new taskpool.Task(sendDataTest, 1); 1312 task.onReceiveData(printLog); 1313 await taskpool.execute(task); 1314 } catch (e) { 1315 console.error(`taskpool: error code: ${e.code}, info: ${e.message}`); 1316 } 1317} 1318 1319taskpoolTest(); 1320``` 1321 1322 1323### onReceiveData<sup>11+</sup> 1324 1325onReceiveData(callback?: Function): void 1326 1327为任务注册回调函数,以接收和处理来自任务池工作线程的数据。使用该方法前需要先构造Task。 1328 1329> **说明:** 1330> 1331> 不支持给同一个任务定义多种回调函数,如果重复赋值只有最后一个会生效。 1332 1333**系统能力:** SystemCapability.Utils.Lang 1334 1335**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1336 1337**参数:** 1338 1339| 参数名 | 类型 | 必填 | 说明 | 1340| -------- | -------- | ---- | ------------------------------------------------------------ | 1341| callback | Function | 否 | 处理数据的回调函数,发送到宿主线程的数据将会作为入参传入该回调函数。不传参可以取消注册的回调函数。 | 1342 1343**错误码:** 1344 1345以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 1346 1347| 错误码ID | 错误信息 | 1348| -------- | -------- | 1349| 401 | Parameter error. Possible causes: 1. Incorrect parameter types; 2. Parameter verification failed. | 1350 1351**示例:** 1352 1353```ts 1354@Concurrent 1355function ConcurrentFunc(num: number): number { 1356 let res: number = num * 10; 1357 taskpool.Task.sendData(res); 1358 return num; 1359} 1360 1361function printLog(data: number): void { 1362 console.info("taskpool: data is: " + data); 1363} 1364 1365async function testFunc(): Promise<void> { 1366 try { 1367 let task: taskpool.Task = new taskpool.Task(ConcurrentFunc, 1); 1368 task.onReceiveData(printLog); 1369 await taskpool.execute(task); 1370 } catch (e) { 1371 console.error(`taskpool: error code: ${e.code}, info: ${e.message}`); 1372 } 1373} 1374 1375testFunc(); 1376``` 1377 1378### addDependency<sup>11+</sup> 1379 1380addDependency(...tasks: Task[]): void 1381 1382为当前任务添加对其他任务的依赖。使用该方法前需要先构造Task。该任务和被依赖的任务不可以是任务组任务、串行队列任务、已执行的任务和周期任务。存在依赖关系的任务(依赖其他任务的任务或被依赖的任务)执行后不可以再次执行。 1383 1384**系统能力:** SystemCapability.Utils.Lang 1385 1386**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1387 1388**参数:** 1389 1390| 参数名 | 类型 | 必填 | 说明 | 1391| ------ | --------------- | ---- | ------------------ | 1392| tasks | [Task](#task)[] | 否 | 被依赖的任务数组。默认值为undefined。 | 1393 1394**错误码:** 1395 1396以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1397 1398| 错误码ID | 错误信息 | 1399| -------- | ------------------------------- | 1400| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 1401| 10200026 | There is a circular dependency. | 1402| 10200052 | The periodic task cannot have a dependency. | 1403 1404**示例:** 1405 1406```ts 1407@Concurrent 1408function delay(args: number): number { 1409 let t: number = Date.now(); 1410 while ((Date.now() - t) < 1000) { 1411 continue; 1412 } 1413 return args; 1414} 1415 1416let task1:taskpool.Task = new taskpool.Task(delay, 100); 1417let task2:taskpool.Task = new taskpool.Task(delay, 200); 1418let task3:taskpool.Task = new taskpool.Task(delay, 200); 1419 1420console.info("dependency: add dependency start"); 1421task1.addDependency(task2); 1422task2.addDependency(task3); 1423console.info("dependency: add dependency end"); 1424 1425console.info("dependency: start execute second") 1426taskpool.execute(task1).then(() => { 1427 console.info("dependency: second task1 success"); 1428}) 1429taskpool.execute(task2).then(() => { 1430 console.info("dependency: second task2 success"); 1431}) 1432taskpool.execute(task3).then(() => { 1433 console.info("dependency: second task3 success"); 1434}) 1435``` 1436 1437### removeDependency<sup>11+</sup> 1438 1439removeDependency(...tasks: Task[]): void 1440 1441删除当前任务对其他任务的依赖。使用该方法前需要先构造Task。 1442 1443**系统能力:** SystemCapability.Utils.Lang 1444 1445**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1446 1447**参数:** 1448 1449| 参数名 | 类型 | 必填 | 说明 | 1450| ------ | ------ | ---- | ------------------ | 1451| tasks | [Task](#task)[] | 否 | 被依赖的任务数组。默认值为undefined。 | 1452 1453**错误码:** 1454 1455以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1456 1457| 错误码ID | 错误信息 | 1458| -------- | ------------------------------ | 1459| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 1460| 10200027 | The dependency does not exist. | 1461| 10200052 | The periodic task cannot have a dependency. | 1462 1463**示例:** 1464 1465```ts 1466@Concurrent 1467function delay(args: number): number { 1468 let t: number = Date.now(); 1469 while ((Date.now() - t) < 1000) { 1470 continue; 1471 } 1472 return args; 1473} 1474 1475let task1:taskpool.Task = new taskpool.Task(delay, 100); 1476let task2:taskpool.Task = new taskpool.Task(delay, 200); 1477let task3:taskpool.Task = new taskpool.Task(delay, 200); 1478 1479console.info("dependency: add dependency start"); 1480task1.addDependency(task2); 1481task2.addDependency(task3); 1482console.info("dependency: add dependency end"); 1483console.info("dependency: remove dependency start"); 1484task1.removeDependency(task2); 1485task2.removeDependency(task3); 1486console.info("dependency: remove dependency end"); 1487 1488console.info("dependency: start execute") 1489taskpool.execute(task1).then(() => { 1490 console.info("dependency: task1 success"); 1491}) 1492taskpool.execute(task2).then(() => { 1493 console.info("dependency: task2 success"); 1494}) 1495taskpool.execute(task3).then(() => { 1496 console.info("dependency: task3 success"); 1497}) 1498``` 1499 1500 1501### onEnqueued<sup>12+</sup> 1502 1503onEnqueued(callback: CallbackFunction): void 1504 1505注册一个回调函数,并在任务入队时调用它。需在任务执行前注册,否则会抛异常。 1506 1507**系统能力:** SystemCapability.Utils.Lang 1508 1509**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 1510 1511**参数:** 1512 1513| 参数名 | 类型 | 必填 | 说明 | 1514| ------ | ------ | ---- | ------------------ | 1515| callback | [CallbackFunction](#callbackfunction12) | 是 | 需注册的回调函数。 | 1516 1517**错误码:** 1518 1519以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1520 1521| 错误码ID | 错误信息 | 1522| -------- | ------------------------------ | 1523| 401 | The input parameters are invalid. | 1524| 10200034 | The executed task does not support the registration of listeners. | 1525 1526**示例:** 1527 1528```ts 1529import { taskpool } from '@kit.ArkTS' 1530 1531@Concurrent 1532function delay(args: number): number { 1533 let t: number = Date.now(); 1534 while ((Date.now() - t) < 1000) { 1535 continue; 1536 } 1537 return args; 1538} 1539 1540let task: taskpool.Task = new taskpool.Task(delay, 1); 1541task.onEnqueued(()=>{ 1542 console.info("taskpool: onEnqueued") 1543}); 1544taskpool.execute(task).then(()=> { 1545 console.info("taskpool: execute task success") 1546}); 1547``` 1548 1549 1550### onStartExecution<sup>12+</sup> 1551 1552onStartExecution(callback: CallbackFunction): void 1553 1554注册一个回调函数,并在执行任务前调用它。需在任务执行前注册,否则会抛异常。 1555 1556**系统能力:** SystemCapability.Utils.Lang 1557 1558**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 1559 1560**参数:** 1561 1562| 参数名 | 类型 | 必填 | 说明 | 1563| ------ | ------ | ---- | ------------------ | 1564| callback | [CallbackFunction](#callbackfunction12) | 是 | 需注册的回调函数。 | 1565 1566**错误码:** 1567 1568以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1569 1570| 错误码ID | 错误信息 | 1571| -------- | ------------------------------ | 1572| 401 | The input parameters are invalid. | 1573| 10200034 | The executed task does not support the registration of listeners. | 1574 1575**示例:** 1576 1577```ts 1578import { taskpool } from '@kit.ArkTS' 1579 1580@Concurrent 1581function delay(args: number): number { 1582 let t: number = Date.now(); 1583 while ((Date.now() - t) < 1000) { 1584 continue; 1585 } 1586 return args; 1587} 1588 1589let task: taskpool.Task = new taskpool.Task(delay, 1); 1590task.onStartExecution(()=>{ 1591 console.info("taskpool: onStartExecution") 1592}); 1593taskpool.execute(task).then(()=> { 1594 console.info("taskpool: execute task success") 1595}); 1596``` 1597 1598### onExecutionFailed<sup>12+</sup> 1599 1600onExecutionFailed(callback: CallbackFunctionWithError): void 1601 1602注册一个回调函数,并在任务执行失败时调用它。需在任务执行前注册,否则会抛异常。 1603 1604**系统能力:** SystemCapability.Utils.Lang 1605 1606**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 1607 1608**参数:** 1609 1610| 参数名 | 类型 | 必填 | 说明 | 1611| ------ | ------ | ---- | ------------------ | 1612| callback | [CallbackFunctionWithError](#callbackfunctionwitherror12) | 是 | 需注册的回调函数。 | 1613 1614**错误码:** 1615 1616以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1617 1618| 错误码ID | 错误信息 | 1619| -------- | ------------------------------ | 1620| 401 | The input parameters are invalid. | 1621| 10200034 | The executed task does not support the registration of listeners. | 1622 1623**示例:** 1624 1625```ts 1626import { taskpool } from '@kit.ArkTS' 1627import { BusinessError } from '@kit.BasicServicesKit' 1628import { HashMap } from '@kit.ArkTS' 1629 1630@Concurrent 1631function test(args:number) { 1632 let t = Date.now() 1633 while ((Date.now() - t) < 100) { 1634 continue; 1635 } 1636 let hashMap1: HashMap<string, number> = new HashMap(); 1637 hashMap1.set('a', args); 1638 return hashMap1; 1639} 1640 1641let task2 = new taskpool.Task(test, 1); 1642task2.onExecutionFailed((e:Error)=>{ 1643 console.info("taskpool: onExecutionFailed error is " + e); 1644}) 1645taskpool.execute(task2).then(()=>{ 1646 console.info("taskpool: execute task success") 1647}).catch((e:BusinessError)=>{ 1648 console.error(`taskpool: error code: ${e.code}, error info: ${e.message}`); 1649}) 1650``` 1651 1652### onExecutionSucceeded<sup>12+</sup> 1653 1654onExecutionSucceeded(callback: CallbackFunction): void 1655 1656注册一个回调函数,并在任务执行成功时调用它。需在任务执行前注册,否则会抛异常。 1657 1658**系统能力:** SystemCapability.Utils.Lang 1659 1660**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 1661 1662**参数:** 1663 1664| 参数名 | 类型 | 必填 | 说明 | 1665| ------ | ------ | ---- | ------------------ | 1666| callback | [CallbackFunction](#callbackfunction12) | 是 | 需注册的回调函数。 | 1667 1668**错误码:** 1669 1670以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1671 1672| 错误码ID | 错误信息 | 1673| -------- | ------------------------------ | 1674| 401 | The input parameters are invalid. | 1675| 10200034 | The executed task does not support the registration of listeners. | 1676 1677**示例:** 1678 1679```ts 1680import { taskpool } from '@kit.ArkTS' 1681 1682@Concurrent 1683function delay(args: number): number { 1684 let t: number = Date.now(); 1685 while ((Date.now() - t) < 1000) { 1686 continue; 1687 } 1688 return args; 1689} 1690 1691let task: taskpool.Task = new taskpool.Task(delay, 1); 1692task.onExecutionSucceeded(()=>{ 1693 console.info("taskpool: onExecutionSucceeded") 1694}); 1695taskpool.execute(task).then(()=> { 1696 console.info("taskpool: execute task success") 1697}); 1698``` 1699 1700### isDone<sup>12+</sup> 1701 1702isDone(): boolean 1703 1704检查任务是否已完成。 1705 1706**系统能力:** SystemCapability.Utils.Lang 1707 1708**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 1709 1710**返回值:** 1711 1712| 类型 | 说明 | 1713| ------- | ------------------------------------ | 1714| boolean | 任务执行完成返回true,任务未执行完成返回false。 | 1715 1716**示例:** 1717 1718```ts 1719@Concurrent 1720function inspectStatus(arg: number): number { 1721 // 2s sleep 1722 let t: number = Date.now(); 1723 while (Date.now() - t < 1000) { 1724 continue; 1725 } 1726 return arg + 1; 1727} 1728 1729async function taskpoolCancel(): Promise<void> { 1730 let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 1731 taskpool.execute(task).then((res: Object)=>{ 1732 console.info("taskpool test result: " + res); 1733 }).catch((err: string) => { 1734 console.error("taskpool test occur error: " + err); 1735 }); 1736 1737 setTimeout(()=>{ 1738 if (!task.isDone()) { 1739 taskpool.cancel(task); 1740 } 1741 }, 3000); // 延时3s,确保任务已执行 1742} 1743 1744taskpoolCancel(); 1745``` 1746 1747## CallbackFunction<sup>12+</sup> 1748 1749type CallbackFunction = () => void 1750 1751注册的回调函数类型。 1752 1753**系统能力:** SystemCapability.Utils.Lang 1754 1755**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 1756 1757 1758## CallbackFunctionWithError<sup>12+</sup> 1759 1760type CallbackFunctionWithError = (e: Error) => void 1761 1762注册带有错误码的回调函数类型。 1763 1764**系统能力:** SystemCapability.Utils.Lang 1765 1766**原子化服务API**:从API version 12开始,该接口支持在原子化服务中使用。 1767**参数:** 1768 1769| 参数名 | 类型 | 必填 | 说明 | 1770| ------ | ------ | ---- | ------------------ | 1771| e | Error | 是 | 错误信息。 | 1772 1773 1774## LongTask<sup>12+</sup> 1775 1776**系统能力:** SystemCapability.Utils.Lang 1777 1778表示长时任务。LongTask继承自[Task](#task)。 1779长时任务不设置执行时间上限,长时间运行不会触发超时异常,但不支持在任务组(TaskGroup)执行和多次执行。 1780执行长时任务的线程一直存在,直到执行完成后调用[terminateTask](#taskpoolterminatetask12),该线程会在空闲时被回收。 1781 1782**示例:** 1783 1784```ts 1785@Concurrent 1786function printArgs(args: string): string { 1787 console.info("printArgs: " + args); 1788 return args; 1789} 1790 1791let task: taskpool.LongTask = new taskpool.LongTask(printArgs, "this is my first LongTask"); 1792``` 1793 1794 1795## GenericsTask<sup>13+</sup> 1796 1797**系统能力:** SystemCapability.Utils.Lang 1798 1799表示泛型任务。GenericsTask继承自[Task](#task)。 1800相比创建Task,创建GenericsTask可以在编译阶段完成对并发函数的传参和返回值类型的校验,其余行为与Task一致。 1801 1802### constructor<sup>13+</sup> 1803 1804constructor(func: (...args: A) => R | Promise\<R>, ...args: A) 1805 1806GenericsTask的构造函数。 1807 1808**系统能力:** SystemCapability.Utils.Lang 1809 1810**原子化服务API**:从API version 13 开始,该接口支持在原子化服务中使用。 1811 1812**参数:** 1813 1814| 参数名 | 类型 | 必填 | 说明 | 1815| ------ | --------- | ---- | -------------------------------------------------------------------- | 1816| func | (...args: A) => R \| Promise\<R> | 是 | 执行的逻辑需要传入函数,必须使用[@Concurrent装饰器](../../arkts-utils/taskpool-introduction.md#concurrent装饰器)装饰,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 1817| args | A | 否 | 任务执行传入函数的入参,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 1818 1819**错误码:** 1820 1821以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1822 1823| 错误码ID | 错误信息 | 1824| -------- | --------------------------------------- | 1825| 401 | Parameter error. Possible causes: 1.Incorrect parameter types; 2.Parameter verification failed. | 1826| 10200014 | The function is not marked as concurrent. | 1827 1828**示例:** 1829 1830```ts 1831@Concurrent 1832function printArgs(args: string): string { 1833 console.info("printArgs: " + args); 1834 return args; 1835} 1836 1837@Concurrent 1838function testWithThreeParams(a: number, b: string, c: number): string { 1839 return b; 1840} 1841 1842@Concurrent 1843function testWithArray(args: [number, string]): string { 1844 return "success"; 1845} 1846 1847let task1: taskpool.Task = new taskpool.GenericsTask<[string], string>(printArgs, "this is my first LongTask"); 1848 1849let task2: taskpool.Task = new taskpool.GenericsTask<[number, string, number], string>(testWithThreeParams, 100, "test", 100); 1850 1851let task3: taskpool.Task = new taskpool.GenericsTask<[[number, string]], string>(testWithArray, [100, "test"]); 1852``` 1853 1854### constructor<sup>13+</sup> 1855 1856constructor(name: string, func: (...args: A) => R | Promise\<R>, ...args: A) 1857 1858GenericsTask的构造函数,可以指定任务名称。 1859 1860**系统能力:** SystemCapability.Utils.Lang 1861 1862**原子化服务API**:从API version 13 开始,该接口支持在原子化服务中使用。 1863 1864**参数:** 1865 1866| 参数名 | 类型 | 必填 | 说明 | 1867| ------ | -------- | ---- | ------------------------------------------------------------ | 1868| name | string | 是 | 泛型任务名称。 | 1869| func | (...args: A) => R \| Promise\<R> | 是 | 执行的逻辑需要传入函数,必须使用[@Concurrent装饰器](../../arkts-utils/taskpool-introduction.md#concurrent装饰器)装饰,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 1870| args | A | 否 | 任务执行传入函数的入参,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 1871 1872**错误码:** 1873 1874以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1875 1876| 错误码ID | 错误信息 | 1877| -------- | --------------------------------------- | 1878| 401 | Parameter error. Possible causes: 1.Incorrect parameter types; 2.Parameter verification failed. | 1879| 10200014 | The function is not marked as concurrent. | 1880 1881**示例:** 1882 1883```ts 1884@Concurrent 1885function printArgs(args: string): string { 1886 console.info("printArgs: " + args); 1887 return args; 1888} 1889 1890let taskName: string = "taskName"; 1891let task: taskpool.Task = new taskpool.GenericsTask<[string], string>(taskName, printArgs, "this is my first Task"); 1892let name: string = task.name; 1893``` 1894 1895## TaskGroup<sup>10+</sup> 1896 1897表示任务组,一次执行一组任务,适用于执行一组有关联的任务。如果所有任务正常执行,异步执行完毕后返回所有任务结果的数组,数组中元素的顺序与[addTask](#addtask10-1)的顺序相同;如果任意任务失败,则会抛出对应异常。如果任务组中存在多个任务失败的情况,则会抛出第一个失败任务的异常。任务组可以多次执行,但执行后不能新增任务。使用[constructor](#constructor10)方法构造TaskGroup。 1898 1899### constructor<sup>10+</sup> 1900 1901constructor() 1902 1903TaskGroup的构造函数。 1904 1905**系统能力:** SystemCapability.Utils.Lang 1906 1907**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1908 1909**示例:** 1910 1911```ts 1912let taskGroup = new taskpool.TaskGroup(); 1913``` 1914 1915### constructor<sup>11+</sup> 1916 1917constructor(name: string) 1918 1919TaskGroup的构造函数,可以指定任务组名称。 1920 1921**系统能力:** SystemCapability.Utils.Lang 1922 1923**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1924 1925**参数:** 1926 1927| 参数名 | 类型 | 必填 | 说明 | 1928| ------ | ------ | ---- | ------------ | 1929| name | string | 是 | 任务组名称。 | 1930 1931**错误码:** 1932 1933以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 1934 1935| 错误码ID | 错误信息 | 1936| -------- | -------- | 1937| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 1938 1939**示例:** 1940 1941```ts 1942let taskGroupName: string = "groupName"; 1943let taskGroup: taskpool.TaskGroup = new taskpool.TaskGroup(taskGroupName); 1944let name: string = taskGroup.name; 1945``` 1946 1947### addTask<sup>10+</sup> 1948 1949addTask(func: Function, ...args: Object[]): void 1950 1951将待执行的函数添加到任务组中。使用该方法前需要先构造TaskGroup。 1952 1953**系统能力:** SystemCapability.Utils.Lang 1954 1955**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1956 1957**参数:** 1958 1959| 参数名 | 类型 | 必填 | 说明 | 1960| ------ | --------- | ---- | ---------------------------------------------------------------------- | 1961| func | Function | 是 | 执行的逻辑需要传入函数,必须使用[@Concurrent装饰器](../../arkts-utils/taskpool-introduction.md#concurrent装饰器)装饰,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 1962| args | Object[] | 否 | 任务执行函数所需要的入参,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 1963 1964**错误码:** 1965 1966以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 1967 1968| 错误码ID | 错误信息 | 1969| -------- | --------------------------------------- | 1970| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 1971| 10200014 | The function is not marked as concurrent. | 1972 1973**示例:** 1974 1975```ts 1976@Concurrent 1977function printArgs(args: number): number { 1978 console.info("printArgs: " + args); 1979 return args; 1980} 1981 1982let taskGroup: taskpool.TaskGroup = new taskpool.TaskGroup(); 1983taskGroup.addTask(printArgs, 100); // 100: test number 1984``` 1985 1986### addTask<sup>10+</sup> 1987 1988addTask(task: Task): void 1989 1990将创建好的任务添加到任务组中。使用该方法前需要先构造TaskGroup。任务组不可以添加其他任务组任务、串行队列任务、有依赖关系的任务、长时任务、周期任务和已执行的任务。 1991 1992**系统能力:** SystemCapability.Utils.Lang 1993 1994**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 1995 1996**参数:** 1997 1998| 参数名 | 类型 | 必填 | 说明 | 1999| -------- | --------------------- | ---- | ---------------------------------------- | 2000| task | [Task](#task) | 是 | 需要添加到任务组中的任务。 | 2001 2002**错误码:** 2003 2004以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 2005 2006| 错误码ID | 错误信息 | 2007| -------- | --------------------------------------- | 2008| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types; 3. Parameter verification failed. | 2009| 10200014 | The function is not marked as concurrent. | 2010| 10200051 | The periodic task cannot be executed again. | 2011 2012**示例:** 2013 2014```ts 2015@Concurrent 2016function printArgs(args: number): number { 2017 console.info("printArgs: " + args); 2018 return args; 2019} 2020 2021let taskGroup: taskpool.TaskGroup = new taskpool.TaskGroup(); 2022let task: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 2023taskGroup.addTask(task); 2024``` 2025 2026### 属性 2027 2028**系统能力:** SystemCapability.Utils.Lang 2029 2030**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 2031 2032| 名称 | 类型 | 可读 | 可写 | 说明 | 2033| ---- | ------ | ---- | ---- | ---------------------------- | 2034| name<sup>11+</sup> | string | 是 | 是 | 创建任务组时指定的任务组名称。 | 2035 2036## SequenceRunner <sup>11+</sup> 2037 2038表示串行队列的任务,用于执行一组需要串行执行的任务。使用[constructor](#constructor11-3)方法构造SequenceRunner。 2039 2040### constructor<sup>11+</sup> 2041 2042constructor(priority?: Priority) 2043 2044SequenceRunner的构造函数。 2045 2046**系统能力:** SystemCapability.Utils.Lang 2047 2048**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 2049 2050**参数:** 2051 2052| 参数名 | 类型 | 必填 | 说明 | 2053| -------- | --------------------- | ---- | ---------------------------------------------------------- | 2054| priority | [Priority](#priority) | 否 | 指定任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 2055 2056**错误码:** 2057 2058以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 2059 2060| 错误码ID | 错误信息 | 2061| -------- | -------- | 2062| 401 | Parameter error. Possible causes: 1. Incorrect parameter types; 2. Parameter verification failed. | 2063 2064**示例:** 2065 2066```ts 2067let runner: taskpool.SequenceRunner = new taskpool.SequenceRunner(); 2068``` 2069 2070### constructor<sup>12+</sup> 2071 2072constructor(name: string, priority?: Priority) 2073 2074SequenceRunner的构造函数。构造一个全局串行队列,如果名字相同,将返回同一个串行队列。 2075 2076> **说明:** 2077> 2078> - 底层通过单例模式保证了:创建同名串行队列时,获取到同一个实例。 2079> - 不支持修改串行队列的优先级。 2080 2081**系统能力:** SystemCapability.Utils.Lang 2082 2083**原子化服务API**:从API version 12 开始,该接口支持在原子化服务中使用。 2084 2085**参数:** 2086 2087| 参数名 | 类型 | 必填 | 说明 | 2088| -------- | --------------------- | ---- | ---------------------------------------------------------- | 2089| name | string | 是 | 串行队列的名字。 | 2090| priority | [Priority](#priority) | 否 | 指定任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 2091 2092**错误码:** 2093 2094以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)。 2095 2096| 错误码ID | 错误信息 | 2097| -------- | -------- | 2098| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified. 2. Incorrect parameter types. 3.Parameter verification failed. | 2099 2100**示例:** 2101 2102```ts 2103let runner:taskpool.SequenceRunner = new taskpool.SequenceRunner("runner1", taskpool.Priority.LOW); 2104``` 2105 2106### execute<sup>11+</sup> 2107 2108execute(task: Task): Promise\<Object> 2109 2110执行串行任务。使用该方法前需要先构造SequenceRunner。串行队列不可以执行任务组任务、其他串行队列任务、有依赖关系的任务和已执行的任务。 2111 2112> **说明:** 2113> 2114> - 不支持加入存在依赖的任务。 2115> - 前面的任务执行失败或取消不影响后续任务执行。 2116 2117**系统能力:** SystemCapability.Utils.Lang 2118 2119**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 2120 2121**参数:** 2122 2123| 参数名 | 类型 | 必填 | 说明 | 2124| ------ | ------------- | ---- | -------------------------------- | 2125| task | [Task](#task) | 是 | 需要添加到串行任务队列中的任务。 | 2126 2127**返回值:** 2128 2129| 类型 | 说明 | 2130| ---------------- | --------------------------------- | 2131| Promise\<Object> | Promise对象,返回任务执行的结果。 | 2132 2133**错误码:** 2134 2135以下错误码的详细介绍请参见[通用错误码](../errorcode-universal.md)和[语言基础类库错误码](errorcode-utils.md)。 2136 2137| 错误码ID | 错误信息 | 2138| -------- | ------------------------------------------- | 2139| 401 | Parameter error. Possible causes: 1. Mandatory parameters are left unspecified; 2. Incorrect parameter types. | 2140| 10200006 | An exception occurred during serialization. | 2141| 10200025 | dependent task not allowed. | 2142| 10200051 | The periodic task cannot be executed again. | 2143 2144**示例:** 2145 2146```ts 2147@Concurrent 2148function additionDelay(delay:number): void { 2149 let start: number = new Date().getTime(); 2150 while (new Date().getTime() - start < delay) { 2151 continue; 2152 } 2153} 2154@Concurrent 2155function waitForRunner(finalString: string): string { 2156 return finalString; 2157} 2158async function seqRunner() 2159{ 2160 let finalString:string = ""; 2161 let task1:taskpool.Task = new taskpool.Task(additionDelay, 3000); 2162 let task2:taskpool.Task = new taskpool.Task(additionDelay, 2000); 2163 let task3:taskpool.Task = new taskpool.Task(additionDelay, 1000); 2164 let task4:taskpool.Task = new taskpool.Task(waitForRunner, finalString); 2165 2166 let runner:taskpool.SequenceRunner = new taskpool.SequenceRunner(); 2167 runner.execute(task1).then(() => { 2168 finalString += 'a'; 2169 console.info("seqrunner: task1 done."); 2170 }); 2171 runner.execute(task2).then(() => { 2172 finalString += 'b'; 2173 console.info("seqrunner: task2 done"); 2174 }); 2175 runner.execute(task3).then(() => { 2176 finalString += 'c'; 2177 console.info("seqrunner: task3 done"); 2178 }); 2179 await runner.execute(task4); 2180 console.info("seqrunner: task4 done, finalString is " + finalString); 2181} 2182``` 2183 2184## State<sup>10+</sup> 2185 2186表示任务(Task)状态的枚举。当任务创建成功后,调用execute,任务进入taskpool等待队列,状态设置为WAITING;任务从等待队列出来进入taskpool工作线程中,任务状态更新为RUNNING;当任务执行完成,返回结果后任务状态重置为WAITING;当主动cancel任务时,将任务状态更新为CANCELED。 2187 2188**系统能力:** SystemCapability.Utils.Lang 2189 2190**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 2191 2192| 名称 | 值 | 说明 | 2193| --------- | -------- | ------------- | 2194| WAITING | 1 | 任务正在等待。 | 2195| RUNNING | 2 | 任务正在执行。 | 2196| CANCELED | 3 | 任务已被取消。 | 2197 2198 2199## TaskInfo<sup>10+</sup> 2200 2201任务的内部信息。 2202 2203**系统能力:** SystemCapability.Utils.Lang 2204 2205### 属性 2206 2207**系统能力:** SystemCapability.Utils.Lang 2208 2209| 名称 | 类型 | 可读 | 可写 | 说明 | 2210| -------- | ------------------ | ---- | ---- | ------------------------------------------------------------- | 2211| name<sup>12+</sup> | string | 是 | 否 | 任务的名字。<br/> **原子化服务API:** 从API version 12开始,该接口支持在原子化服务中使用。 | 2212| taskId | number | 是 | 否 | 任务的ID。<br/> **原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 | 2213| state | [State](#state10) | 是 | 否 | 任务的状态。<br/> **原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 | 2214| duration | number | 是 | 否 | 任务执行至当前所用的时间,单位为ms。当返回为0时,表示任务未执行;返回为空时,表示没有任务执行。<br/> **原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 | 2215 2216## ThreadInfo<sup>10+</sup> 2217 2218工作线程的内部信息。 2219 2220**系统能力:** SystemCapability.Utils.Lang 2221 2222### 属性 2223 2224**系统能力:** SystemCapability.Utils.Lang 2225 2226**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 2227 2228| 名称 | 类型 | 可读 | 可写 | 说明 | 2229| -------- | ---------------------- | ---- | ---- | -------------------------------------------------------- | 2230| tid | number | 是 | 否 | 工作线程的标识符。返回为空时,代表没有任务执行。 | 2231| taskIds | number[] | 是 | 否 | 在当前线程上运行的任务id列表。返回为空时,代表没有任务执行。 | 2232| priority | [Priority](#priority) | 是 | 否 | 当前线程的优先级。返回为空时,代表没有任务执行。 | 2233 2234## TaskPoolInfo<sup>10+</sup> 2235 2236任务池的内部信息。 2237 2238**系统能力:** SystemCapability.Utils.Lang 2239 2240### 属性 2241 2242**系统能力:** SystemCapability.Utils.Lang 2243 2244**原子化服务API**:从API version 11 开始,该接口支持在原子化服务中使用。 2245 2246| 名称 | 类型 | 可读 | 可写 | 说明 | 2247| ------------- | -------------------------------- | ---- | ---- | -------------------- | 2248| threadInfos | [ThreadInfo[]](#threadinfo10) | 是 | 否 | 工作线程的内部信息。 | 2249| taskInfos | [TaskInfo[]](#taskinfo10) | 是 | 否 | 任务的内部信息。 | 2250 2251 2252## 其他说明 2253 2254### 序列化支持类型 2255序列化支持类型包括:目前支持的数据类型有[普通对象](../../arkts-utils/normal-object.md)、[ArrayBuffer对象](../../arkts-utils/arraybuffer-object.md)、[SharedArrayBuffer对象](../../arkts-utils/shared-arraybuffer-object.md)、[Transferable对象(NativeBinding对象)](../../arkts-utils/transferabled-object.md)、[Sendable对象](../../arkts-utils/arkts-sendable.md)五种。 2256 2257### 简单使用 2258 2259**示例一** 2260 2261```ts 2262// 支持普通函数、引用入参传递 2263@Concurrent 2264function printArgs(args: string): string { 2265 console.info("func: " + args); 2266 return args; 2267} 2268 2269async function taskpoolExecute(): Promise<void> { 2270 // taskpool.execute(task) 2271 let task: taskpool.Task = new taskpool.Task(printArgs, "create task, then execute"); 2272 console.info("taskpool.execute(task) result: " + await taskpool.execute(task)); 2273 // taskpool.execute(function) 2274 console.info("taskpool.execute(function) result: " + await taskpool.execute(printArgs, "execute task by func")); 2275} 2276 2277taskpoolExecute(); 2278``` 2279 2280**示例二** 2281 2282```ts 2283// b.ets 2284export let c: string = "hello"; 2285``` 2286<!--code_no_check--> 2287```ts 2288// 引用import变量 2289// a.ets(与b.ets位于同一目录中) 2290import { c } from "./b"; 2291 2292@Concurrent 2293function printArgs(a: string): string { 2294 console.info(a); 2295 console.info(c); 2296 return a; 2297} 2298 2299async function taskpoolExecute(): Promise<void> { 2300 // taskpool.execute(task) 2301 let task: taskpool.Task = new taskpool.Task(printArgs, "create task, then execute"); 2302 console.info("taskpool.execute(task) result: " + await taskpool.execute(task)); 2303 2304 // taskpool.execute(function) 2305 console.info("taskpool.execute(function) result: " + await taskpool.execute(printArgs, "execute task by func")); 2306} 2307 2308taskpoolExecute(); 2309``` 2310 2311**示例三** 2312 2313```ts 2314// 支持async函数 2315@Concurrent 2316async function delayExecute(): Promise<Object> { 2317 let ret = await Promise.all<Object>([ 2318 new Promise<Object>(resolve => setTimeout(resolve, 1000, "resolved")) 2319 ]); 2320 return ret; 2321} 2322 2323async function taskpoolExecute(): Promise<void> { 2324 taskpool.execute(delayExecute).then((result: Object) => { 2325 console.info("taskPoolTest task result: " + result); 2326 }).catch((err: string) => { 2327 console.error("taskpool test occur error: " + err); 2328 }); 2329} 2330 2331taskpoolExecute(); 2332``` 2333 2334**示例四** 2335 2336```ts 2337// c.ets 2338import { taskpool } from '@kit.ArkTS'; 2339 2340@Concurrent 2341function strSort(inPutArr: Array<string>): Array<string> { 2342 let newArr = inPutArr.sort(); 2343 return newArr; 2344} 2345 2346export async function func1(): Promise<void> { 2347 console.info("taskpoolTest start"); 2348 let strArray: Array<string> = ['c test string', 'b test string', 'a test string']; 2349 let task: taskpool.Task = new taskpool.Task(strSort, strArray); 2350 console.info("func1 result:" + await taskpool.execute(task)); 2351} 2352 2353export async function func2(): Promise<void> { 2354 console.info("taskpoolTest2 start"); 2355 let strArray: Array<string> = ['c test string', 'b test string', 'a test string']; 2356 taskpool.execute(strSort, strArray).then((result: Object) => { 2357 console.info("func2 result: " + result); 2358 }).catch((err: string) => { 2359 console.error("taskpool test occur error: " + err); 2360 }); 2361} 2362``` 2363<!--code_no_check--> 2364```ts 2365// index.ets 2366import { func1, func2 } from "./c"; 2367 2368func1(); 2369func2(); 2370``` 2371 2372**示例五** 2373 2374```ts 2375// 任务取消成功 2376@Concurrent 2377function inspectStatus(arg: number): number { 2378 // 第一次检查任务是否已经取消并作出响应 2379 if (taskpool.Task.isCanceled()) { 2380 console.info("task has been canceled before 2s sleep."); 2381 return arg + 2; 2382 } 2383 // 2s sleep 2384 let t: number = Date.now(); 2385 while (Date.now() - t < 2000) { 2386 continue; 2387 } 2388 // 第二次检查任务是否已经取消并作出响应 2389 if (taskpool.Task.isCanceled()) { 2390 console.info("task has been canceled after 2s sleep."); 2391 return arg + 3; 2392 } 2393 return arg + 1; 2394} 2395 2396async function taskpoolCancel(): Promise<void> { 2397 let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 2398 taskpool.execute(task).then((res: Object) => { 2399 console.info("taskpool test result: " + res); 2400 }).catch((err: string) => { 2401 console.error("taskpool test occur error: " + err); 2402 }); 2403 // 1s后取消task 2404 setTimeout(() => { 2405 try { 2406 taskpool.cancel(task); 2407 } catch (e) { 2408 console.error(`taskpool: cancel error code: ${e.code}, info: ${e.message}`); 2409 } 2410 }, 1000); 2411} 2412 2413taskpoolCancel(); 2414``` 2415 2416**示例六** 2417 2418```ts 2419// 已执行的任务取消失败 2420@Concurrent 2421function inspectStatus(arg: number): number { 2422 // 第一次检查任务是否已经取消并作出响应 2423 if (taskpool.Task.isCanceled()) { 2424 return arg + 2; 2425 } 2426 // 延时2s 2427 let t: number = Date.now(); 2428 while (Date.now() - t < 500) { 2429 continue; 2430 } 2431 // 第二次检查任务是否已经取消并作出响应 2432 if (taskpool.Task.isCanceled()) { 2433 return arg + 3; 2434 } 2435 return arg + 1; 2436} 2437 2438async function taskpoolCancel(): Promise<void> { 2439 let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 2440 taskpool.execute(task).then((res: Object) => { 2441 console.info("taskpool test result: " + res); 2442 }).catch((err: string) => { 2443 console.error("taskpool test occur error: " + err); 2444 }); 2445 2446 setTimeout(() => { 2447 try { 2448 taskpool.cancel(task); // 任务已执行,取消失败 2449 } catch (e) { 2450 console.error(`taskpool: cancel error code: ${e.code}, info: ${e.message}`); 2451 } 2452 }, 3000); // 延时3s,确保任务已执行 2453} 2454 2455taskpoolCancel(); 2456``` 2457 2458**示例七** 2459 2460```ts 2461// 待执行的任务组取消成功 2462@Concurrent 2463function printArgs(args: number): number { 2464 let t: number = Date.now(); 2465 while (Date.now() - t < 1000) { 2466 continue; 2467 } 2468 console.info("printArgs: " + args); 2469 return args; 2470} 2471 2472async function taskpoolGroupCancelTest(): Promise<void> { 2473 let taskGroup1: taskpool.TaskGroup = new taskpool.TaskGroup(); 2474 taskGroup1.addTask(printArgs, 10); // 10: test number 2475 taskGroup1.addTask(printArgs, 20); // 20: test number 2476 taskGroup1.addTask(printArgs, 30); // 30: test number 2477 let taskGroup2: taskpool.TaskGroup = new taskpool.TaskGroup(); 2478 let task1: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 2479 let task2: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 2480 let task3: taskpool.Task = new taskpool.Task(printArgs, 300); // 300: test number 2481 taskGroup2.addTask(task1); 2482 taskGroup2.addTask(task2); 2483 taskGroup2.addTask(task3); 2484 taskpool.execute(taskGroup1).then((res: Array<Object>) => { 2485 console.info("taskpool execute res is:" + res); 2486 }).catch((e: string) => { 2487 console.error("taskpool execute error is:" + e); 2488 }); 2489 taskpool.execute(taskGroup2).then((res: Array<Object>) => { 2490 console.info("taskpool execute res is:" + res); 2491 }).catch((e: string) => { 2492 console.error("taskpool execute error is:" + e); 2493 }); 2494 2495 try { 2496 taskpool.cancel(taskGroup2); 2497 } catch (e) { 2498 console.error(`taskpool: cancel error code: ${e.code}, info: ${e.message}`); 2499 } 2500} 2501 2502taskpoolGroupCancelTest() 2503``` 2504 2505**示例八** 2506 2507```ts 2508// 分别创建执行100个高、中、低优先级的任务,查看其各项信息 2509@Concurrent 2510function delay(): void { 2511 let start: number = new Date().getTime(); 2512 while (new Date().getTime() - start < 500) { 2513 continue; 2514 } 2515} 2516 2517let highCount: number = 0; 2518let mediumCount: number = 0; 2519let lowCount: number = 0; 2520let allCount: number = 100; 2521for (let i = 0; i < allCount; i++) { 2522 let task1: taskpool.Task = new taskpool.Task(delay); 2523 let task2: taskpool.Task = new taskpool.Task(delay); 2524 let task3: taskpool.Task = new taskpool.Task(delay); 2525 taskpool.execute(task1, taskpool.Priority.LOW).then(() => { 2526 lowCount++; 2527 }).catch((e: string) => { 2528 console.error("low task error: " + e); 2529 }) 2530 taskpool.execute(task2, taskpool.Priority.MEDIUM).then(() => { 2531 mediumCount++; 2532 }).catch((e: string) => { 2533 console.error("medium task error: " + e); 2534 }) 2535 taskpool.execute(task3, taskpool.Priority.HIGH).then(() => { 2536 highCount++; 2537 }).catch((e: string) => { 2538 console.error("high task error: " + e); 2539 }) 2540} 2541let start: number = new Date().getTime(); 2542while (new Date().getTime() - start < 1000) { 2543 continue; 2544} 2545let taskpoolInfo: taskpool.TaskPoolInfo = taskpool.getTaskPoolInfo(); 2546let tid: number = 0; 2547let taskIds: Array<number> = []; 2548let priority: number = 0; 2549let taskId: number = 0; 2550let state: number = 0; 2551let duration: number = 0; 2552let name: string = ""; 2553let threadIS = Array.from(taskpoolInfo.threadInfos) 2554for (let threadInfo of threadIS) { 2555 tid = threadInfo.tid; 2556 if (threadInfo.taskIds != undefined && threadInfo.priority != undefined) { 2557 taskIds.length = threadInfo.taskIds.length; 2558 priority = threadInfo.priority; 2559 } 2560 console.info("taskpool---tid is:" + tid + ", taskIds is:" + taskIds + ", priority is:" + priority); 2561} 2562let taskIS = Array.from(taskpoolInfo.taskInfos) 2563for (let taskInfo of taskIS) { 2564 taskId = taskInfo.taskId; 2565 state = taskInfo.state; 2566 if (taskInfo.duration != undefined) { 2567 duration = taskInfo.duration; 2568 name = taskInfo.name; 2569 } 2570 console.info("taskpool---taskId is:" + taskId + ", state is:" + state + ", duration is:" + duration + ", name is:" + name); 2571} 2572```