• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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```