1# @ohos.taskpool(启动任务池) 2 3任务池(taskpool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任务进行如任务执行、任务取消的操作。理论上您可以使用任务池API创建数量不受限制的任务,但是出于内存因素不建议您这样做。此外,不建议您在任务中执行阻塞操作,特别是无限期阻塞操作,长时间的阻塞操作占据工作线程,可能会阻塞其他任务调度,影响您的应用性能。 4 5您所创建的同一优先级任务的执行顺序可以由您决定,任务真实执行的顺序与您调用任务池API提供的任务执行接口顺序一致。任务默认优先级是MEDIUM。 6 7当同一时间待执行的任务数量大于任务池工作线程数量,任务池会根据负载均衡机制进行扩容,增加工作线程数量,减少整体等待时长。同样,当执行的任务数量减少,工作线程数量大于执行任务数量,部分工作线程处于空闲状态,任务池会根据负载均衡机制进行缩容,减少工作线程数量。 8 9任务池API以数字形式返回错误码。有关各个错误码的更多信息,请参阅文档[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 10 11> **说明:**<br/> 12> 本模块首批接口从API version 9 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 13 14## 导入模块 15 16```ts 17import taskpool from '@ohos.taskpool'; 18``` 19## taskpool.execute 20 21execute(func: Function, ...args: unknown[]): Promise\<unknown> 22 23将待执行的函数放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式不可取消任务。 24 25**系统能力:** SystemCapability.Utils.Lang 26 27**参数:** 28 29| 参数名 | 类型 | 必填 | 说明 | 30| ------ | --------- | ---- | ---------------------------------------------------------------------- | 31| func | Function | 是 | 执行的逻辑需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 32| args | unknown[] | 否 | 执行逻辑的函数所需要的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 33 34**返回值:** 35 36| 类型 | 说明 | 37| ----------------- | ------------------------------------ | 38| Promise\<unknown> | execute是异步方法,返回Promise对象。 | 39 40**错误码:** 41 42以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 43 44| 错误码ID | 错误信息 | 45| -------- | -------------------------------------------- | 46| 10200003 | Worker initialization failure. | 47| 10200006 | An exception occurred during serialization. | 48| 10200014 | The function is not mark as concurrent. | 49 50**示例:** 51 52```ts 53@Concurrent 54function printArgs(args: number): number { 55 console.log("printArgs: " + args); 56 return args; 57} 58 59taskpool.execute(printArgs, 100).then((value: number) => { // 100: test number 60 console.log("taskpool result: " + value); 61}); 62``` 63 64## taskpool.execute 65 66execute(task: Task, priority?: Priority): Promise\<unknown> 67 68将创建好的任务放入taskpool内部任务队列等待,等待分发到工作线程执行。当前执行模式可尝试调用cancel进行任务取消。 69 70**系统能力:** SystemCapability.Utils.Lang 71 72**参数:** 73 74| 参数名 | 类型 | 必填 | 说明 | 75| -------- | --------------------- | ---- | ---------------------------------------- | 76| task | [Task](#task) | 是 | 需要在任务池中执行的任务。 | 77| priority | [Priority](#priority) | 否 | 等待执行的任务的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 78 79**返回值:** 80 81| 类型 | 说明 | 82| ---------------- | ---------------- | 83| Promise\<unknown> | 返回Promise对象。 | 84 85**错误码:** 86 87以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 88 89| 错误码ID | 错误信息 | 90| -------- | ------------------------------------------- | 91| 10200003 | Worker initialization failure. | 92| 10200006 | An exception occurred during serialization. | 93| 10200014 | The function is not mark as concurrent. | 94 95**示例:** 96 97```ts 98@Concurrent 99function printArgs(args: number): number { 100 console.log("printArgs: " + args); 101 return args; 102} 103 104let task: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 105taskpool.execute(task).then((value: number) => { 106 console.log("taskpool result: " + value); 107}); 108``` 109 110## taskpool.execute<sup>10+</sup> 111 112execute(group: TaskGroup, priority?: Priority): Promise<unknown[]> 113 114将创建好的任务组放入taskpool内部任务队列等待,等待分发到工作线程执行。 115 116**系统能力:** SystemCapability.Utils.Lang 117 118**参数:** 119 120| 参数名 | 类型 | 必填 | 说明 | 121| --------- | --------------------------- | ---- | -------------------------------------------------------------- | 122| group | [TaskGroup](#taskgroup10) | 是 | 需要在任务池中执行的任务组。 | 123| priority | [Priority](#priority) | 否 | 等待执行的任务组的优先级,该参数默认值为taskpool.Priority.MEDIUM。 | 124 125**返回值:** 126 127| 类型 | 说明 | 128| ---------------- | ---------------------------------- | 129| Promise\<unknown[]> | execute是异步方法,返回Promise对象。 | 130 131**错误码:** 132 133以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 134 135| 错误码ID | 错误信息 | 136| -------- | ------------------------------------------- | 137| 10200006 | An exception occurred during serialization. | 138 139**示例:** 140 141```ts 142@Concurrent 143function printArgs(args: number): number { 144 console.log("printArgs: " + args); 145 return args; 146} 147 148let taskGroup1: taskpool.TaskGroup = new taskpool.TaskGroup(); 149taskGroup1.addTask(printArgs, 10); // 10: test number 150taskGroup1.addTask(printArgs, 20); // 20: test number 151taskGroup1.addTask(printArgs, 30); // 30: test number 152 153let taskGroup2: taskpool.TaskGroup = new taskpool.TaskGroup(); 154let task1: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 155let task2: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 156let task3: taskpool.Task = new taskpool.Task(printArgs, 300); // 300: test number 157taskGroup2.addTask(task1); 158taskGroup2.addTask(task2); 159taskGroup2.addTask(task3); 160taskpool.execute(taskGroup1).then((res: Array<number>) => { 161 console.info("taskpool execute res is:" + res); 162}); 163taskpool.execute(taskGroup2).then((res: Array<number>) => { 164 console.info("taskpool execute res is:" + res); 165}); 166``` 167 168## taskpool.cancel 169 170cancel(task: Task): void 171 172取消任务池中的任务。 173 174**系统能力:** SystemCapability.Utils.Lang 175 176**参数:** 177 178| 参数名 | 类型 | 必填 | 说明 | 179| ------ | ------------- | ---- | -------------------- | 180| task | [Task](#task) | 是 | 需要取消执行的任务。 | 181 182**错误码:** 183 184以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 185 186| 错误码ID | 错误信息 | 187| -------- | -------------------------------------------- | 188| 10200015 | The task does not exist when it is canceled. | 189| 10200016 | The task is executing when it is canceled. | 190 191从API version10开始,此接口调用时不再涉及上报错误码10200016。 192 193**正在执行的任务取消示例:** 194 195```ts 196@Concurrent 197function inspectStatus(arg: number): number { 198 // 第一时间检查取消并回复 199 if (taskpool.Task.isCanceled()) { 200 console.log("task has been canceled before 2s sleep."); 201 return arg + 2; 202 } 203 // 2s sleep 204 let t: number = Date.now(); 205 while (Date.now() - t < 2000) { 206 continue; 207 } 208 // 第二次检查取消并作出响应 209 if (taskpool.Task.isCanceled()) { 210 console.log("task has been canceled after 2s sleep."); 211 return arg + 3; 212 } 213 return arg + 1; 214} 215 216let task1: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 217let task2: taskpool.Task = new taskpool.Task(inspectStatus, 200); // 200: test number 218let task3: taskpool.Task = new taskpool.Task(inspectStatus, 300); // 300: test number 219let task4: taskpool.Task = new taskpool.Task(inspectStatus, 400); // 400: test number 220let task5: taskpool.Task = new taskpool.Task(inspectStatus, 500); // 500: test number 221let task6: taskpool.Task = new taskpool.Task(inspectStatus, 600); // 600: test number 222taskpool.execute(task1).then((res: number)=>{ 223 console.log("taskpool test result: " + res); 224}); 225taskpool.execute(task2); 226taskpool.execute(task3); 227taskpool.execute(task4); 228taskpool.execute(task5); 229taskpool.execute(task6); 230// 1s后取消task 231setTimeout(()=>{ 232 taskpool.cancel(task1); 233 234}, 1000); 235``` 236 237## taskpool.cancel<sup>10+</sup> 238 239cancel(group: TaskGroup): void 240 241取消任务池中的任务组。 242 243**系统能力:** SystemCapability.Utils.Lang 244 245**参数:** 246 247| 参数名 | 类型 | 必填 | 说明 | 248| ------- | ----------------------- | ---- | -------------------- | 249| group | [TaskGroup](#taskgroup10) | 是 | 需要取消执行的任务组。 | 250 251**错误码:** 252 253以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 254 255| 错误码ID | 错误信息 | 256| -------- | ------------------------------------------------------- | 257| 10200018 | The task group does not exist when it is canceled. | 258 259**示例:** 260 261```ts 262@Concurrent 263function printArgs(args: number): number { 264 let t: number = Date.now(); 265 while (Date.now() - t < 2000) { 266 continue; 267 } 268 console.log("printArgs: " + args); 269 return args; 270} 271 272let taskGroup1: taskpool.TaskGroup = new taskpool.TaskGroup(); 273taskGroup1.addTask(printArgs, 10); // 10: test number 274let taskGroup2: taskpool.TaskGroup = new taskpool.TaskGroup(); 275taskGroup2.addTask(printArgs, 100); // 100: test number 276taskpool.execute(taskGroup1).then((res: Array<number>)=>{ 277 console.info("taskGroup1 res is:" + res); 278}); 279taskpool.execute(taskGroup2).then((res: Array<number>)=>{ 280 console.info("taskGroup2 res is:" + res); 281}); 282setTimeout(()=>{ 283 try { 284 taskpool.cancel(taskGroup2); 285 } catch (e) { 286 console.log("taskGroup.cancel occur error:" + e); 287 } 288}, 1000); 289``` 290 291 292## taskpool.getTaskPoolInfo<sup>10+</sup> 293 294getTaskPoolInfo(): TaskPoolInfo 295 296获取任务池内部信息。 297 298**系统能力:** SystemCapability.Utils.Lang 299 300**返回值:** 301 302| 类型 | 说明 | 303| ----------------------------------- | ------------------ | 304| [TaskPoolInfo](#taskpoolinfo10) | 任务池的内部信息。 | 305 306**示例:** 307 308```ts 309let taskpoolInfo: taskpool.TaskPoolInfo = taskpool.getTaskPoolInfo(); 310``` 311 312## Priority 313 314表示所创建任务(Task)的优先级。 315 316**系统能力:** SystemCapability.Utils.Lang 317 318| 名称 | 值 | 说明 | 319| -------- | -------- | -------- | 320| HIGH | 0 | 任务为高优先级。 | 321| MEDIUM | 1 | 任务为中优先级。 | 322| LOW | 2 | 任务为低优先级。 | 323 324**示例:** 325 326```ts 327@Concurrent 328function printArgs(args: number): number { 329 console.log("printArgs: " + args); 330 return args; 331} 332 333let task: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 334let highCount = 0; 335let mediumCount = 0; 336let lowCount = 0; 337let allCount = 100; 338for (let i: number = 0; i < allCount; i++) { 339 taskpool.execute(task, taskpool.Priority.LOW).then((res: number) => { 340 lowCount++; 341 console.log("taskpool lowCount is :" + lowCount); 342 }); 343 taskpool.execute(task, taskpool.Priority.MEDIUM).then((res: number) => { 344 mediumCount++; 345 console.log("taskpool mediumCount is :" + mediumCount); 346 }); 347 taskpool.execute(task, taskpool.Priority.HIGH).then((res: number) => { 348 highCount++; 349 console.log("taskpool highCount is :" + highCount); 350 }); 351} 352``` 353 354## Task 355 356表示任务。使用[constructor](#constructor)方法构造Task。 357 358### constructor 359 360constructor(func: Function, ...args: unknown[]) 361 362Task的构造函数。 363 364**系统能力:** SystemCapability.Utils.Lang 365 366**参数:** 367 368| 参数名 | 类型 | 必填 | 说明 | 369| ------ | --------- | ---- | -------------------------------------------------------------------- | 370| func | Function | 是 | 任务执行需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 371| args | unknown[] | 否 | 任务执行传入函数的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 372 373**错误码:** 374 375以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 376 377| 错误码ID | 错误信息 | 378| -------- | --------------------------------------- | 379| 10200014 | The function is not mark as concurrent. | 380 381**示例:** 382 383```ts 384@Concurrent 385function printArgs(args: number): number { 386 console.log("printArgs: " + args); 387 return args; 388} 389 390let task: taskpool.Task = new taskpool.Task(printArgs, "this is my first Task"); 391``` 392 393### isCanceled<sup>10+</sup> 394 395static isCanceled(): boolean 396 397检查当前正在运行的任务是否已取消。使用该方法前需要先构造Task。 398 399**系统能力:** SystemCapability.Utils.Lang 400 401**返回值:** 402 403| 类型 | 说明 | 404| ------- | ------------------------------------ | 405| boolean | 如果当前正在运行的任务被取消返回true,未被取消返回false。| 406 407**示例:** 408 409```ts 410@Concurrent 411function inspectStatus(arg: number): number { 412 // do something 413 if (taskpool.Task.isCanceled()) { 414 console.log("task has been canceled."); 415 // do something 416 return arg + 1; 417 } 418 // do something 419 return arg; 420} 421``` 422 423> **说明:**<br/> 424> isCanceled方法需要和taskpool.cancel方法搭配使用,如果不调用cancel方法,isCanceled方法默认返回false。 425 426**示例:** 427 428```ts 429@Concurrent 430function inspectStatus(arg: number): number { 431 // 第一时间检查取消并回复 432 if (taskpool.Task.isCanceled()) { 433 console.log("task has been canceled before 2s sleep."); 434 return arg + 2; 435 } 436 // 延时2s 437 let t: number = Date.now(); 438 while (Date.now() - t < 2000) { 439 continue; 440 } 441 // 第二次检查取消并作出响应 442 if (taskpool.Task.isCanceled()) { 443 console.log("task has been canceled after 2s sleep."); 444 return arg + 3; 445 } 446 return arg + 1; 447} 448 449let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 450taskpool.execute(task).then((res: number)=>{ 451 console.log("taskpool test result: " + res); 452}).catch((err: string) => { 453 console.log("taskpool test occur error: " + err); 454}); 455// 不调用cancel,isCanceled()默认返回false,task执行的结果为101 456``` 457 458### setTransferList<sup>10+</sup> 459 460setTransferList(transfer?: ArrayBuffer[]): void 461 462设置任务的传输列表。使用该方法前需要先构造Task。 463 464> **说明:**<br/> 465> 此接口可以设置任务池中ArrayBuffer的transfer列表,transfer列表中的ArrayBuffer对象在传输时不会复制buffer内容到工作线程而是转移buffer控制权至工作线程,传输后当前的ArrayBuffer失效。 466 467**系统能力:** SystemCapability.Utils.Lang 468 469**参数:** 470 471| 参数名 | 类型 | 必填 | 说明 | 472| -------- | ------------- | ---- | --------------------------------------------- | 473| transfer | ArrayBuffer[] | 否 | 可传输对象是ArrayBuffer的实例对象,默认为空数组。 | 474 475**示例:** 476 477```ts 478let buffer: ArrayBuffer = new ArrayBuffer(8); 479let view: Uint8Array = new Uint8Array(buffer); 480let buffer1: ArrayBuffer = new ArrayBuffer(16); 481let view1: Uint8Array = new Uint8Array(buffer1); 482 483console.info("testTransfer view byteLength: " + view.byteLength); 484console.info("testTransfer view1 byteLength: " + view1.byteLength); 485@Concurrent 486function testTransfer(arg1: ArrayBuffer, arg2: ArrayBuffer): number { 487 console.info("testTransfer arg1 byteLength: " + arg1.byteLength); 488 console.info("testTransfer arg2 byteLength: " + arg2.byteLength); 489 return 100; 490} 491let task: taskpool.Task = new taskpool.Task(testTransfer, view, view1); 492task.setTransferList([view.buffer, view1.buffer]); 493taskpool.execute(task).then((res: number)=>{ 494 console.info("test result: " + res); 495}).catch((e: string)=>{ 496 console.error("test catch: " + e); 497}) 498console.info("testTransfer view byteLength: " + view.byteLength); 499console.info("testTransfer view1 byteLength: " + view1.byteLength); 500``` 501 502### 属性 503 504**系统能力:** SystemCapability.Utils.Lang 505 506| 名称 | 类型 | 可读 | 可写 | 说明 | 507| --------- | --------- | ---- | ---- | ------------------------------------------------------------------------- | 508| function | Function | 是 | 是 | 创建任务时需要传入的函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 509| arguments | unknown[] | 是 | 是 | 创建任务传入函数所需的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。 | 510 511## TaskGroup<sup>10+</sup> 512 513表示任务组。使用[constructor](#constructor10)方法构造TaskGroup。 514 515### constructor<sup>10+</sup> 516 517constructor() 518 519TaskGroup的构造函数。 520 521**系统能力:** SystemCapability.Utils.Lang 522 523**示例:** 524 525```ts 526let taskGroup = new taskpool.TaskGroup(); 527``` 528 529### addTask<sup>10+</sup> 530 531addTask(func: Function, ...args: unknown[]): void 532 533将待执行的函数添加到任务组中。使用该方法前需要先构造TaskGroup。 534 535**系统能力:** SystemCapability.Utils.Lang 536 537**参数:** 538 539| 参数名 | 类型 | 必填 | 说明 | 540| ------ | --------- | ---- | ---------------------------------------------------------------------- | 541| func | Function | 是 | 任务执行需要传入函数,支持的函数返回值类型请查[序列化支持类型](#序列化支持类型)。 | 542| args | unknown[] | 否 | 任务执行函数所需要的参数,支持的参数类型请查[序列化支持类型](#序列化支持类型)。默认值为undefined。 | 543 544**错误码:** 545 546以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 547 548| 错误码ID | 错误信息 | 549| -------- | --------------------------------------- | 550| 10200014 | The function is not mark as concurrent. | 551 552**示例:** 553 554```ts 555@Concurrent 556function printArgs(args: number): number { 557 console.log("printArgs: " + args); 558 return args; 559} 560 561let taskGroup: taskpool.TaskGroup = new taskpool.TaskGroup(); 562taskGroup.addTask(printArgs, 100); // 100: test number 563``` 564 565### addTask<sup>10+</sup> 566 567addTask(task: Task): void 568 569将创建好的任务添加到任务组中。使用该方法前需要先构造TaskGroup。 570 571**系统能力:** SystemCapability.Utils.Lang 572 573**参数:** 574 575| 参数名 | 类型 | 必填 | 说明 | 576| -------- | --------------------- | ---- | ---------------------------------------- | 577| task | [Task](#task) | 是 | 需要添加到任务组中的任务。 | 578 579**错误码:** 580 581以下错误码的详细介绍请参见[语言基础类库错误码](../errorcodes/errorcode-utils.md)。 582 583| 错误码ID | 错误信息 | 584| -------- | --------------------------------------- | 585| 10200014 | The function is not mark as concurrent. | 586 587**示例:** 588 589```ts 590@Concurrent 591function printArgs(args: number): number { 592 console.log("printArgs: " + args); 593 return args; 594} 595 596let taskGroup: taskpool.TaskGroup = new taskpool.TaskGroup(); 597let task: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 598taskGroup.addTask(task); 599``` 600 601 602## State<sup>10+</sup> 603 604表示任务(Task)状态的枚举。 605 606**系统能力:** SystemCapability.Utils.Lang 607 608| 名称 | 值 | 说明 | 609| --------- | -------- | ------------- | 610| WAITING | 1 | 任务正在等待。 | 611| RUNNING | 2 | 任务正在执行。 | 612| CANCELED | 3 | 任务已被取消。 | 613 614 615## TaskInfo<sup>10+</sup> 616 617任务的内部信息。 618 619**系统能力:** SystemCapability.Utils.Lang 620 621### 属性 622 623**系统能力:** SystemCapability.Utils.Lang 624 625| 名称 | 类型 | 可读 | 可写 | 说明 | 626| -------- | ------------------ | ---- | ---- | ------------------------------------------------------------- | 627| taskId | number | 是 | 否 | 任务的ID。 | 628| state | [State](#state10) | 是 | 否 | 任务的状态。 | 629| duration | number | 是 | 否 | 任务执行至当前所用的时间,单位为ms。当返回为0时,表示任务未执行;返回为空时,表示没有任务执行 | 630 631## ThreadInfo<sup>10+</sup> 632 633工作线程的内部信息。 634 635**系统能力:** SystemCapability.Utils.Lang 636 637### 属性 638 639**系统能力:** SystemCapability.Utils.Lang 640 641| 名称 | 类型 | 可读 | 可写 | 说明 | 642| -------- | ---------------------- | ---- | ---- | -------------------------------------------------------- | 643| tid | number | 是 | 否 | 工作线程的标识符。返回为空时,代表没有任务执行。 | 644| taskIds | number[] | 是 | 否 | 在当前线程上运行的任务id列表。返回为空时,代表没有任务执行。 | 645| priority | [Priority](#priority) | 是 | 否 | 当前线程的优先级。返回为空时,代表没有任务执行。 | 646 647## TaskPoolInfo<sup>10+</sup> 648 649任务池的内部信息。 650 651**系统能力:** SystemCapability.Utils.Lang 652 653### 属性 654 655**系统能力:** SystemCapability.Utils.Lang 656 657| 名称 | 类型 | 可读 | 可写 | 说明 | 658| ------------- | -------------------------------- | ---- | ---- | -------------------- | 659| threadInfos | [ThreadInfo[]](#threadinfo10) | 是 | 否 | 工作线程的内部信息。 | 660| taskInfos | [TaskInfo[]](#taskinfo10) | 是 | 否 | 任务的内部信息。 | 661 662 663## 其他说明 664 665### 序列化支持类型 666序列化支持类型包括:All Primitive Type(不包括symbol)、Date、String、RegExp、Array、Map、Set、Object、ArrayBuffer、TypedArray。 667 668### 简单使用 669 670**示例一** 671 672```ts 673// 支持普通函数、引用入参传递 674@Concurrent 675function printArgs(args: number): number { 676 console.log("func: " + args); 677 return args; 678} 679async function taskpoolExecute(): Promise<void> { 680 // taskpool.execute(task) 681 let task: taskpool.Task = new taskpool.Task(printArgs, "create task, then execute"); 682 console.log("taskpool.execute(task) result: " + await taskpool.execute(task)); 683 // taskpool.execute(function) 684 console.log("taskpool.execute(function) result: " + await taskpool.execute(printArgs, "execute task by func")); 685} 686taskpoolExecute(); 687``` 688 689**示例二** 690 691```ts 692// b.ets 693export let c: string = "hello"; 694``` 695```ts 696// 引用import变量 697// a.ets(与b.ets位于同一目录中) 698import { c } from "./b"; 699 700@Concurrent 701function printArgs(a: string): string { 702 console.log(a); 703 console.log(c); 704 return a; 705} 706 707async function taskpoolExecute(): Promise<void> { 708 // taskpool.execute(task) 709 let task: taskpool.Task = new taskpool.Task(printArgs, "create task, then execute"); 710 console.log("taskpool.execute(task) result: " + await taskpool.execute(task)); 711 712 // taskpool.execute(function) 713 console.log("taskpool.execute(function) result: " + await taskpool.execute(printArgs, "execute task by func")); 714} 715 716taskpoolExecute(); 717``` 718 719**示例三** 720 721```ts 722// 支持async函数 723@Concurrent 724async function delayExcute(): Promise<Object> { 725 let ret = await Promise.all<Object>([ 726 new Promise<Object>(resolve => setTimeout(resolve, 1000, "resolved")) 727 ]); 728 return ret; 729} 730 731async function taskpoolExecute(): Promise<void> { 732 taskpool.execute(delayExcute).then((result: string) => { 733 console.log("taskPoolTest task result: " + result); 734 }).catch((err: string) => { 735 console.log("taskpool test occur error: " + err); 736 }); 737} 738 739taskpoolExecute(); 740``` 741 742**示例四** 743 744```ts 745// c.ets 746@Concurrent 747function strSort(inPutArr: Array<string>): Array<string> { 748 let newArr = inPutArr.sort(); 749 return newArr; 750} 751export async function func1(): Promise<void> { 752 console.log("taskpoolTest start"); 753 let strArray: Array<string> = ['c test string', 'b test string', 'a test string']; 754 let task: taskpool.Task = new taskpool.Task(strSort, strArray); 755 console.log("func1 result:" + await taskpool.execute(task)); 756} 757 758export async function func2(): Promise<void> { 759 console.log("taskpoolTest2 start"); 760 let strArray: Array<string> = ['c test string', 'b test string', 'a test string']; 761 taskpool.execute(strSort, strArray).then((result: Array<string>) => { 762 console.log("func2 result: " + result); 763 }).catch((err: string) => { 764 console.log("taskpool test occur error: " + err); 765 }); 766} 767``` 768 769```ts 770// a.ets(与c.ets在同一目录中) 771import { func1, func2 } from "./c"; 772 773func1(); 774func2(); 775``` 776 777**示例五** 778 779```ts 780// 任务取消成功 781@Concurrent 782function inspectStatus(arg: number): number { 783 // 第一时间检查取消并回复 784 if (taskpool.Task.isCanceled()) { 785 console.log("task has been canceled before 2s sleep."); 786 return arg + 2; 787 } 788 // 2s sleep 789 let t: number = Date.now(); 790 while (Date.now() - t < 2000) { 791 continue; 792 } 793 // 第二次检查取消并作出响应 794 if (taskpool.Task.isCanceled()) { 795 console.log("task has been canceled after 2s sleep."); 796 return arg + 3; 797 } 798 return arg + 1; 799} 800 801async function taskpoolCancel(): Promise<void> { 802 let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 803 taskpool.execute(task).then((res: number)=>{ 804 console.log("taskpool test result: " + res); 805 }).catch((err: string) => { 806 console.log("taskpool test occur error: " + err); 807 }); 808 // 1s后取消task 809 setTimeout(()=>{ 810 taskpool.cancel(task);}, 1000); 811} 812 813taskpoolCancel(); 814``` 815 816**示例六** 817 818```ts 819// 已执行的任务取消失败 820@Concurrent 821function inspectStatus(arg: number): number { 822 // 第一时间检查取消并回复 823 if (taskpool.Task.isCanceled()) { 824 return arg + 2; 825 } 826 // 延时2s 827 let t: number = Date.now(); 828 while (Date.now() - t < 500) { 829 continue; 830 } 831 // 第二次检查取消并作出响应 832 if (taskpool.Task.isCanceled()) { 833 return arg + 3; 834 } 835 return arg + 1; 836} 837 838async function taskpoolCancel(): Promise<void> { 839 let task: taskpool.Task = new taskpool.Task(inspectStatus, 100); // 100: test number 840 taskpool.execute(task).then((res: number)=>{ 841 console.log("taskpool test result: " + res); 842 }).catch((err: string) => { 843 console.log("taskpool test occur error: " + err); 844 }); 845 846 setTimeout(()=>{ 847 try { 848 taskpool.cancel(task); // 任务已执行,取消失败 849 } catch (e) { 850 console.log("taskpool.cancel occur error:" + e); 851 } 852 }, 3000); // 延时3s,确保任务已执行 853} 854 855taskpoolCancel(); 856``` 857 858**示例七** 859 860```ts 861// 待执行的任务组取消成功 862@Concurrent 863function printArgs(args: number): number { 864 let t: number = Date.now(); 865 while (Date.now() - t < 1000) { 866 continue; 867 } 868 console.log("printArgs: " + args); 869 return args; 870} 871 872async function taskpoolGroupCancelTest(): Promise<void> { 873 let taskGroup1: taskpool.TaskGroup = new taskpool.TaskGroup(); 874 taskGroup1.addTask(printArgs, 10); // 10: test number 875 taskGroup1.addTask(printArgs, 20); // 20: test number 876 taskGroup1.addTask(printArgs, 30); // 30: test number 877 let taskGroup2: taskpool.TaskGroup = new taskpool.TaskGroup(); 878 let task1: taskpool.Task = new taskpool.Task(printArgs, 100); // 100: test number 879 let task2: taskpool.Task = new taskpool.Task(printArgs, 200); // 200: test number 880 let task3: taskpool.Task = new taskpool.Task(printArgs, 300); // 300: test number 881 taskGroup2.addTask(task1); 882 taskGroup2.addTask(task2); 883 taskGroup2.addTask(task3); 884 taskpool.execute(taskGroup1).then((res: Array<number>) => { 885 console.info("taskpool execute res is:" + res); 886 }).catch((e: string) => { 887 console.error("taskpool execute error is:" + e); 888 }); 889 taskpool.execute(taskGroup2).then((res: Array<number>) => { 890 console.info("taskpool execute res is:" + res); 891 }).catch((e: string) => { 892 console.error("taskpool execute error is:" + e); 893 }); 894 895 taskpool.cancel(taskGroup2); 896} 897 898taskpoolGroupCancelTest() 899``` 900 901**示例八** 902 903```ts 904// 分别创建执行100个高、中、低优先级的任务,查看其各项信息 905@Concurrent 906function delay(): void { 907 let start: number = new Date().getTime(); 908 while (new Date().getTime() - start < 500) { 909 continue; 910 } 911} 912 913let highCount: number = 0; 914let mediumCount: number = 0; 915let lowCount: number = 0; 916let allCount: number = 100; 917for (let i = 0; i < allCount; i++) { 918 let task1: taskpool.Task = new taskpool.Task(delay); 919 let task2: taskpool.Task = new taskpool.Task(delay); 920 let task3: taskpool.Task = new taskpool.Task(delay); 921 taskpool.execute(task1, taskpool.Priority.LOW).then(() => { 922 lowCount++; 923 }).catch((e: string) => { 924 console.error("low task error: " + e); 925 }) 926 taskpool.execute(task2, taskpool.Priority.MEDIUM).then(() => { 927 mediumCount++; 928 }).catch((e: string) => { 929 console.error("medium task error: " + e); 930 }) 931 taskpool.execute(task3, taskpool.Priority.HIGH).then(() => { 932 highCount++; 933 }).catch((e: string) => { 934 console.error("high task error: " + e); 935 }) 936} 937let start: number = new Date().getTime(); 938while (new Date().getTime() - start < 1000) { 939 continue; 940} 941let taskpoolInfo: taskpool.TaskPoolInfo = taskpool.getTaskPoolInfo(); 942let tid: number = 0; 943let taskIds: Array<number> = []; 944let priority: number = 0; 945let taskId: number = 0; 946let state: number = 0; 947let duration: number = 0; 948let threadIS = Array.from(taskpoolInfo.threadInfos) 949for(let threadInfo of threadIS) { 950 tid = threadInfo.tid; 951 if (threadInfo.taskIds != undefined && threadInfo.priority != undefined ) 952 { 953 taskIds.length = threadInfo.taskIds.length; 954 priority = threadInfo.priority; 955 } 956 console.info("taskpool---tid is:" + tid + ", taskIds is:" + taskIds + ", priority is:" + priority); 957} 958let taskIS = Array.from(taskpoolInfo.taskInfos) 959for(let taskInfo of taskIS) { 960 taskId = taskInfo.taskId; 961 state = taskInfo.state; 962 if (taskInfo.duration != undefined ) 963 { 964 duration = taskInfo.duration; 965 } 966 console.info("taskpool---taskId is:" + taskId + ", state is:" + state + ", duration is:" + duration); 967} 968```