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