1e41f4b71Sopenharmony_ci# TaskPool简介
2e41f4b71Sopenharmony_ci
3e41f4b71Sopenharmony_ci任务池(TaskPool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。具体接口信息及使用方法详情请见[TaskPool](../reference/apis-arkts/js-apis-taskpool.md)。
4e41f4b71Sopenharmony_ci
5e41f4b71Sopenharmony_ci## TaskPool运作机制
6e41f4b71Sopenharmony_ci
7e41f4b71Sopenharmony_ciTaskPool运作机制示意图
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci![zh-cn_image_0000001964858368](figures/zh-cn_image_0000001964858368.png)
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ciTaskPool支持开发者在主线程封装任务抛给任务队列,系统选择合适的工作线程,进行任务的分发及执行,再将结果返回给主线程。接口直观易用,支持任务的执行、取消,以及指定优先级的能力,同时通过系统统一线程管理,结合动态调度及负载均衡算法,可以节约系统资源。系统默认会启动一个任务工作线程,当任务较多时会扩容,工作线程数量上限跟当前设备的物理核数相关,具体数量内部管理,保证最优的调度及执行效率,长时间没有任务分发时会缩容,减少工作线程数量。
12e41f4b71Sopenharmony_ci
13e41f4b71Sopenharmony_ci## TaskPool注意事项
14e41f4b71Sopenharmony_ci
15e41f4b71Sopenharmony_ci- 实现任务的函数需要使用[@Concurrent装饰器](#concurrent装饰器)标注,且仅支持在.ets文件中使用。
16e41f4b71Sopenharmony_ci
17e41f4b71Sopenharmony_ci- 从API version 11开始,跨并发实例传递带方法的实例对象时,该类必须使用装饰器[@Sendable装饰器](sendable-overview.md#sendable装饰器)标注,且仅支持在.ets文件中使用。
18e41f4b71Sopenharmony_ci
19e41f4b71Sopenharmony_ci- 任务函数在TaskPool工作线程的执行耗时不能超过3分钟(不包含Promise和async/await异步调用的耗时,例如网络下载、文件读写等I/O任务的耗时),否则会被强制退出。
20e41f4b71Sopenharmony_ci
21e41f4b71Sopenharmony_ci- 实现任务的函数入参需满足序列化支持的类型,详情请参见[线程间通信对象](interthread-communication-overview.md)。
22e41f4b71Sopenharmony_ci
23e41f4b71Sopenharmony_ci- ArrayBuffer参数在TaskPool中默认转移,需要设置转移列表的话可通过接口[setTransferList()](../reference/apis-arkts/js-apis-taskpool.md#settransferlist10)设置。
24e41f4b71Sopenharmony_ci
25e41f4b71Sopenharmony_ci- 由于不同线程中上下文对象是不同的,因此TaskPool工作线程只能使用线程安全的库,例如UI相关的非线程安全库不能使用。
26e41f4b71Sopenharmony_ci
27e41f4b71Sopenharmony_ci- 序列化传输的数据量大小限制为16MB。
28e41f4b71Sopenharmony_ci
29e41f4b71Sopenharmony_ci- [Priority](../reference/apis-arkts/js-apis-taskpool.md#priority)的IDLE优先级是用来标记需要在后台运行的耗时任务(例如数据同步、备份),它的优先级别是最低的。这种优先级标记的任务只会在所有线程都空闲的情况下触发执行,并且只会占用一个线程来执行。
30e41f4b71Sopenharmony_ci
31e41f4b71Sopenharmony_ci- Promise不支持跨线程传递,如果TaskPool返回pending或rejected状态的Promise,会返回失败;对于fulfilled状态的Promise,TaskPool会解析返回的结果,如果结果可以跨线程传递,则返回成功。
32e41f4b71Sopenharmony_ci
33e41f4b71Sopenharmony_ci- 不支持在TaskPool工作线程中使用[AppStorage](../quick-start/arkts-appstorage.md)。
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_ci## \@Concurrent装饰器
36e41f4b71Sopenharmony_ci
37e41f4b71Sopenharmony_ci在使用[TaskPool](zh-cn_topic_0000001936203798.xml)时,执行的并发函数需要使用该装饰器修饰,否则无法通过相关校验。
38e41f4b71Sopenharmony_ci
39e41f4b71Sopenharmony_ci> **说明:**
40e41f4b71Sopenharmony_ci>
41e41f4b71Sopenharmony_ci> 从API version 9开始,支持使用\@Concurrent装饰器声明并校验并发函数。
42e41f4b71Sopenharmony_ci
43e41f4b71Sopenharmony_ci### 装饰器说明
44e41f4b71Sopenharmony_ci
45e41f4b71Sopenharmony_ci| \@Concurrent并发装饰器 | 说明 |
46e41f4b71Sopenharmony_ci| -------- | -------- |
47e41f4b71Sopenharmony_ci| 装饰器参数 | 无。 |
48e41f4b71Sopenharmony_ci| 使用场景 | 仅支持在Stage模型的工程中使用。仅支持在.ets文件中使用。 |
49e41f4b71Sopenharmony_ci| 装饰的函数类型 | 允许标注async函数或普通函数。禁止标注generator、箭头函数、method。不支持类成员函数或者匿名函数。 |
50e41f4b71Sopenharmony_ci| 装饰的函数内的变量类型 | 允许使用local变量、入参和通过import引入的变量。禁止使用闭包变量。 |
51e41f4b71Sopenharmony_ci| 装饰的函数内的返回值类型 | 支持的类型请查[线程间通信对象](interthread-communication-overview.md)。 |
52e41f4b71Sopenharmony_ci
53e41f4b71Sopenharmony_ci> **说明:**
54e41f4b71Sopenharmony_ci>
55e41f4b71Sopenharmony_ci> 由于\@Concurrent标记的函数不能访问闭包,因此\@Concurrent标记的函数内部不能调用当前文件的其他函数,例如:
56e41f4b71Sopenharmony_ci>
57e41f4b71Sopenharmony_ci> ```ts
58e41f4b71Sopenharmony_ci> function bar() {
59e41f4b71Sopenharmony_ci> }
60e41f4b71Sopenharmony_ci> 
61e41f4b71Sopenharmony_ci> @Concurrent
62e41f4b71Sopenharmony_ci> function foo() {
63e41f4b71Sopenharmony_ci> bar(); // 违反闭包原则,报错
64e41f4b71Sopenharmony_ci> }
65e41f4b71Sopenharmony_ci> ```
66e41f4b71Sopenharmony_ci
67e41f4b71Sopenharmony_ci### 装饰器使用示例
68e41f4b71Sopenharmony_ci
69e41f4b71Sopenharmony_ci#### 并发函数一般使用
70e41f4b71Sopenharmony_ci
71e41f4b71Sopenharmony_ci并发函数为一个计算两数之和的普通函数,taskpool执行该函数并返回结果。
72e41f4b71Sopenharmony_ci
73e41f4b71Sopenharmony_ci示例:
74e41f4b71Sopenharmony_ci
75e41f4b71Sopenharmony_ci```ts
76e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS';
77e41f4b71Sopenharmony_ci
78e41f4b71Sopenharmony_ci@Concurrent
79e41f4b71Sopenharmony_cifunction add(num1: number, num2: number): number {
80e41f4b71Sopenharmony_ci  return num1 + num2;
81e41f4b71Sopenharmony_ci}
82e41f4b71Sopenharmony_ci
83e41f4b71Sopenharmony_ciasync function ConcurrentFunc(): Promise<void> {
84e41f4b71Sopenharmony_ci  try {
85e41f4b71Sopenharmony_ci    let task: taskpool.Task = new taskpool.Task(add, 1, 2);
86e41f4b71Sopenharmony_ci    console.info("taskpool res is: " + await taskpool.execute(task));
87e41f4b71Sopenharmony_ci  } catch (e) {
88e41f4b71Sopenharmony_ci    console.error("taskpool execute error is: " + e);
89e41f4b71Sopenharmony_ci  }
90e41f4b71Sopenharmony_ci}
91e41f4b71Sopenharmony_ci
92e41f4b71Sopenharmony_ci@Entry
93e41f4b71Sopenharmony_ci@Component
94e41f4b71Sopenharmony_cistruct Index {
95e41f4b71Sopenharmony_ci  @State message: string = 'Hello World'
96e41f4b71Sopenharmony_ci
97e41f4b71Sopenharmony_ci  build() {
98e41f4b71Sopenharmony_ci    Row() {
99e41f4b71Sopenharmony_ci      Column() {
100e41f4b71Sopenharmony_ci        Text(this.message)
101e41f4b71Sopenharmony_ci          .fontSize(50)
102e41f4b71Sopenharmony_ci          .fontWeight(FontWeight.Bold)
103e41f4b71Sopenharmony_ci          .onClick(() => {
104e41f4b71Sopenharmony_ci            ConcurrentFunc();
105e41f4b71Sopenharmony_ci          })
106e41f4b71Sopenharmony_ci      }
107e41f4b71Sopenharmony_ci      .width('100%')
108e41f4b71Sopenharmony_ci    }
109e41f4b71Sopenharmony_ci    .height('100%')
110e41f4b71Sopenharmony_ci  }
111e41f4b71Sopenharmony_ci}
112e41f4b71Sopenharmony_ci```
113e41f4b71Sopenharmony_ci
114e41f4b71Sopenharmony_ci#### 并发函数返回Promise
115e41f4b71Sopenharmony_ci
116e41f4b71Sopenharmony_ci并发函数中返回Promise的表现需关注,其中并发同步函数会处理返回该Promise并返回结果,如下例所示。
117e41f4b71Sopenharmony_ci
118e41f4b71Sopenharmony_ci示例:
119e41f4b71Sopenharmony_ci
120e41f4b71Sopenharmony_ci```ts
121e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS';
122e41f4b71Sopenharmony_ci
123e41f4b71Sopenharmony_ci@Concurrent
124e41f4b71Sopenharmony_cifunction testPromise(args1: number, args2: number): Promise<number> {
125e41f4b71Sopenharmony_ci  return new Promise<number>((testFuncA, testFuncB)=>{
126e41f4b71Sopenharmony_ci    testFuncA(args1 + args2);
127e41f4b71Sopenharmony_ci  });
128e41f4b71Sopenharmony_ci}
129e41f4b71Sopenharmony_ci
130e41f4b71Sopenharmony_ci@Concurrent
131e41f4b71Sopenharmony_ciasync function testPromise1(args1: number, args2: number): Promise<number> {
132e41f4b71Sopenharmony_ci  return new Promise<number>((testFuncA, testFuncB)=>{
133e41f4b71Sopenharmony_ci    testFuncA(args1 + args2);
134e41f4b71Sopenharmony_ci  });
135e41f4b71Sopenharmony_ci}
136e41f4b71Sopenharmony_ci
137e41f4b71Sopenharmony_ci@Concurrent
138e41f4b71Sopenharmony_ciasync function testPromise2(args1: number, args2: number): Promise<number> {
139e41f4b71Sopenharmony_ci  return await new Promise<number>((testFuncA, testFuncB)=>{
140e41f4b71Sopenharmony_ci    testFuncA(args1 + args2)
141e41f4b71Sopenharmony_ci  });
142e41f4b71Sopenharmony_ci}
143e41f4b71Sopenharmony_ci
144e41f4b71Sopenharmony_ci@Concurrent
145e41f4b71Sopenharmony_cifunction testPromise3() {
146e41f4b71Sopenharmony_ci  return Promise.resolve(1);
147e41f4b71Sopenharmony_ci}
148e41f4b71Sopenharmony_ci
149e41f4b71Sopenharmony_ci@Concurrent
150e41f4b71Sopenharmony_ciasync function testPromise4(): Promise<number> {
151e41f4b71Sopenharmony_ci  return 1;
152e41f4b71Sopenharmony_ci}
153e41f4b71Sopenharmony_ci
154e41f4b71Sopenharmony_ci@Concurrent
155e41f4b71Sopenharmony_ciasync function testPromise5(): Promise<string> {
156e41f4b71Sopenharmony_ci  return await new Promise((resolve) => {
157e41f4b71Sopenharmony_ci    setTimeout(()=>{
158e41f4b71Sopenharmony_ci      resolve("Promise setTimeout after resolve");
159e41f4b71Sopenharmony_ci    }, 1000)
160e41f4b71Sopenharmony_ci  });
161e41f4b71Sopenharmony_ci}
162e41f4b71Sopenharmony_ci
163e41f4b71Sopenharmony_ciasync function testConcurrentFunc() {
164e41f4b71Sopenharmony_ci  let task1: taskpool.Task = new taskpool.Task(testPromise, 1, 2);
165e41f4b71Sopenharmony_ci  let task2: taskpool.Task = new taskpool.Task(testPromise1, 1, 2);
166e41f4b71Sopenharmony_ci  let task3: taskpool.Task = new taskpool.Task(testPromise2, 1, 2);
167e41f4b71Sopenharmony_ci  let task4: taskpool.Task = new taskpool.Task(testPromise3);
168e41f4b71Sopenharmony_ci  let task5: taskpool.Task = new taskpool.Task(testPromise4);
169e41f4b71Sopenharmony_ci  let task6: taskpool.Task = new taskpool.Task(testPromise5);
170e41f4b71Sopenharmony_ci
171e41f4b71Sopenharmony_ci  taskpool.execute(task1).then((d:object)=>{
172e41f4b71Sopenharmony_ci    console.info("task1 res is: " + d)
173e41f4b71Sopenharmony_ci  }).catch((e:object)=>{
174e41f4b71Sopenharmony_ci    console.info("task1 catch e: " + e)
175e41f4b71Sopenharmony_ci  })
176e41f4b71Sopenharmony_ci  taskpool.execute(task2).then((d:object)=>{
177e41f4b71Sopenharmony_ci    console.info("task2 res is: " + d)
178e41f4b71Sopenharmony_ci  }).catch((e:object)=>{
179e41f4b71Sopenharmony_ci    console.info("task2 catch e: " + e)
180e41f4b71Sopenharmony_ci  })
181e41f4b71Sopenharmony_ci  taskpool.execute(task3).then((d:object)=>{
182e41f4b71Sopenharmony_ci    console.info("task3 res is: " + d)
183e41f4b71Sopenharmony_ci  }).catch((e:object)=>{
184e41f4b71Sopenharmony_ci    console.info("task3 catch e: " + e)
185e41f4b71Sopenharmony_ci  })
186e41f4b71Sopenharmony_ci  taskpool.execute(task4).then((d:object)=>{
187e41f4b71Sopenharmony_ci    console.info("task4 res is: " + d)
188e41f4b71Sopenharmony_ci  }).catch((e:object)=>{
189e41f4b71Sopenharmony_ci    console.info("task4 catch e: " + e)
190e41f4b71Sopenharmony_ci  })
191e41f4b71Sopenharmony_ci  taskpool.execute(task5).then((d:object)=>{
192e41f4b71Sopenharmony_ci    console.info("task5 res is: " + d)
193e41f4b71Sopenharmony_ci  }).catch((e:object)=>{
194e41f4b71Sopenharmony_ci    console.info("task5 catch e: " + e)
195e41f4b71Sopenharmony_ci  })
196e41f4b71Sopenharmony_ci  taskpool.execute(task6).then((d:object)=>{
197e41f4b71Sopenharmony_ci    console.info("task6 res is: " + d)
198e41f4b71Sopenharmony_ci  }).catch((e:object)=>{
199e41f4b71Sopenharmony_ci    console.info("task6 catch e: " + e)
200e41f4b71Sopenharmony_ci  })
201e41f4b71Sopenharmony_ci}
202e41f4b71Sopenharmony_ci
203e41f4b71Sopenharmony_ci@Entry
204e41f4b71Sopenharmony_ci@Component
205e41f4b71Sopenharmony_cistruct Index {
206e41f4b71Sopenharmony_ci  @State message: string = 'Hello World';
207e41f4b71Sopenharmony_ci
208e41f4b71Sopenharmony_ci  build() {
209e41f4b71Sopenharmony_ci    Row() {
210e41f4b71Sopenharmony_ci      Column() {
211e41f4b71Sopenharmony_ci        Button(this.message)
212e41f4b71Sopenharmony_ci          .fontSize(50)
213e41f4b71Sopenharmony_ci          .fontWeight(FontWeight.Bold)
214e41f4b71Sopenharmony_ci          .onClick(() => {
215e41f4b71Sopenharmony_ci            testConcurrentFunc();
216e41f4b71Sopenharmony_ci          })
217e41f4b71Sopenharmony_ci      }
218e41f4b71Sopenharmony_ci      .width('100%')
219e41f4b71Sopenharmony_ci    }
220e41f4b71Sopenharmony_ci    .height('100%')
221e41f4b71Sopenharmony_ci  }
222e41f4b71Sopenharmony_ci}
223e41f4b71Sopenharmony_ci```
224e41f4b71Sopenharmony_ci
225e41f4b71Sopenharmony_ci#### 并发函数中使用自定义类或函数
226e41f4b71Sopenharmony_ci
227e41f4b71Sopenharmony_ci并发函数中使用自定义类或函数时需定义在不同文件,否则会被认为是闭包,如下例所示。
228e41f4b71Sopenharmony_ci
229e41f4b71Sopenharmony_ci示例:
230e41f4b71Sopenharmony_ci
231e41f4b71Sopenharmony_ci```ts
232e41f4b71Sopenharmony_ci// Index.ets
233e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS';
234e41f4b71Sopenharmony_ciimport { BusinessError } from '@kit.BasicServicesKit';
235e41f4b71Sopenharmony_ciimport { testAdd, MyTestA, MyTestB } from './Test';
236e41f4b71Sopenharmony_ci
237e41f4b71Sopenharmony_cifunction add(arg: number) {
238e41f4b71Sopenharmony_ci  return ++arg;
239e41f4b71Sopenharmony_ci}
240e41f4b71Sopenharmony_ci
241e41f4b71Sopenharmony_ciclass TestA {
242e41f4b71Sopenharmony_ci  constructor(name: string) {
243e41f4b71Sopenharmony_ci    this.name = name;
244e41f4b71Sopenharmony_ci  }
245e41f4b71Sopenharmony_ci  name: string = 'ClassA';
246e41f4b71Sopenharmony_ci}
247e41f4b71Sopenharmony_ci
248e41f4b71Sopenharmony_ciclass TestB {
249e41f4b71Sopenharmony_ci  static nameStr: string = 'ClassB';
250e41f4b71Sopenharmony_ci}
251e41f4b71Sopenharmony_ci
252e41f4b71Sopenharmony_ci@Concurrent
253e41f4b71Sopenharmony_cifunction TestFunc() {
254e41f4b71Sopenharmony_ci  // case1:在并发函数中直接调用同文件内定义的类或函数
255e41f4b71Sopenharmony_ci
256e41f4b71Sopenharmony_ci  // 直接调用同文件定义的函数add(),add飘红报错:Only imported variables and local variables can be used in @Concurrent decorated functions. <ArkTSCheck>
257e41f4b71Sopenharmony_ci  // add(1);
258e41f4b71Sopenharmony_ci  // 直接使用同文件定义的TestA构造,TestA飘红报错:Only imported variables and local variables can be used in @Concurrent decorated functions. <ArkTSCheck>
259e41f4b71Sopenharmony_ci  // let a = new TestA("aaa");
260e41f4b71Sopenharmony_ci  // 直接访问同文件定义的TestB的成员nameStr,TestB飘红报错:Only imported variables and local variables can be used in @Concurrent decorated functions. <ArkTSCheck>
261e41f4b71Sopenharmony_ci  // console.info("TestB name is: " + TestB.nameStr);
262e41f4b71Sopenharmony_ci
263e41f4b71Sopenharmony_ci  // case2:在并发函数中调用定义在Test.ets文件并导入当前文件的类或函数
264e41f4b71Sopenharmony_ci
265e41f4b71Sopenharmony_ci  // 输出结果:res1 is: 2
266e41f4b71Sopenharmony_ci  console.info("res1 is: " + testAdd(1));
267e41f4b71Sopenharmony_ci  let tmpStr = new MyTestA("TEST A");
268e41f4b71Sopenharmony_ci  // 输出结果:res2 is: TEST A
269e41f4b71Sopenharmony_ci  console.info("res2 is: " + tmpStr.name);
270e41f4b71Sopenharmony_ci  // 输出结果:res3 is: MyTestB
271e41f4b71Sopenharmony_ci  console.info("res3 is: " + MyTestB.nameStr);
272e41f4b71Sopenharmony_ci}
273e41f4b71Sopenharmony_ci
274e41f4b71Sopenharmony_ci
275e41f4b71Sopenharmony_ci@Entry
276e41f4b71Sopenharmony_ci@Component
277e41f4b71Sopenharmony_cistruct Index {
278e41f4b71Sopenharmony_ci  @State message: string = 'Hello World';
279e41f4b71Sopenharmony_ci
280e41f4b71Sopenharmony_ci  build() {
281e41f4b71Sopenharmony_ci    RelativeContainer() {
282e41f4b71Sopenharmony_ci      Text(this.message)
283e41f4b71Sopenharmony_ci        .id('HelloWorld')
284e41f4b71Sopenharmony_ci        .fontSize(50)
285e41f4b71Sopenharmony_ci        .fontWeight(FontWeight.Bold)
286e41f4b71Sopenharmony_ci        .alignRules({
287e41f4b71Sopenharmony_ci          center: { anchor: '__container__', align: VerticalAlign.Center },
288e41f4b71Sopenharmony_ci          middle: { anchor: '__container__', align: HorizontalAlign.Center }
289e41f4b71Sopenharmony_ci        })
290e41f4b71Sopenharmony_ci        .onClick(() => {
291e41f4b71Sopenharmony_ci          let task = new taskpool.Task(TestFunc);
292e41f4b71Sopenharmony_ci          taskpool.execute(task).then(() => {
293e41f4b71Sopenharmony_ci            console.info("taskpool: execute task success!");
294e41f4b71Sopenharmony_ci          }).catch((e:BusinessError) => {
295e41f4b71Sopenharmony_ci            console.error(`taskpool: execute: Code: ${e.code}, message: ${e.message}`);
296e41f4b71Sopenharmony_ci          })
297e41f4b71Sopenharmony_ci        })
298e41f4b71Sopenharmony_ci    }
299e41f4b71Sopenharmony_ci    .height('100%')
300e41f4b71Sopenharmony_ci    .width('100%')
301e41f4b71Sopenharmony_ci  }
302e41f4b71Sopenharmony_ci}
303e41f4b71Sopenharmony_ci```
304e41f4b71Sopenharmony_ci
305e41f4b71Sopenharmony_ci```ts
306e41f4b71Sopenharmony_ci// Test.ets
307e41f4b71Sopenharmony_ciexport function testAdd(arg: number) {
308e41f4b71Sopenharmony_ci  return ++arg;
309e41f4b71Sopenharmony_ci}
310e41f4b71Sopenharmony_ci
311e41f4b71Sopenharmony_ci@Sendable
312e41f4b71Sopenharmony_ciexport class MyTestA {
313e41f4b71Sopenharmony_ci  constructor(name: string) {
314e41f4b71Sopenharmony_ci    this.name = name;
315e41f4b71Sopenharmony_ci  }
316e41f4b71Sopenharmony_ci  name: string = 'MyTestA';
317e41f4b71Sopenharmony_ci}
318e41f4b71Sopenharmony_ci
319e41f4b71Sopenharmony_ciexport class MyTestB {
320e41f4b71Sopenharmony_ci  static nameStr:string = 'MyTestB';
321e41f4b71Sopenharmony_ci}
322e41f4b71Sopenharmony_ci```
323e41f4b71Sopenharmony_ci
324e41f4b71Sopenharmony_ci#### 并发异步函数中使用Promise
325e41f4b71Sopenharmony_ci
326e41f4b71Sopenharmony_ci并发异步函数中如果使用Promise,建议搭配await使用捕获Promise中可能发生的异常。推荐使用示例如下。
327e41f4b71Sopenharmony_ci
328e41f4b71Sopenharmony_ci示例:
329e41f4b71Sopenharmony_ci
330e41f4b71Sopenharmony_ci```ts
331e41f4b71Sopenharmony_ciimport { taskpool } from '@kit.ArkTS'
332e41f4b71Sopenharmony_ci
333e41f4b71Sopenharmony_ci@Concurrent
334e41f4b71Sopenharmony_ciasync function testPromiseError() {
335e41f4b71Sopenharmony_ci  await new Promise<number>((resolve, reject) => {
336e41f4b71Sopenharmony_ci    resolve(1);
337e41f4b71Sopenharmony_ci  }).then(()=>{
338e41f4b71Sopenharmony_ci    throw new Error("testPromise Error");
339e41f4b71Sopenharmony_ci  })
340e41f4b71Sopenharmony_ci}
341e41f4b71Sopenharmony_ci
342e41f4b71Sopenharmony_ci@Concurrent
343e41f4b71Sopenharmony_ciasync function testPromiseError1() {
344e41f4b71Sopenharmony_ci  await new Promise<string>((resolve, reject) => {
345e41f4b71Sopenharmony_ci    reject("testPromiseError1 Error msg");
346e41f4b71Sopenharmony_ci  })
347e41f4b71Sopenharmony_ci}
348e41f4b71Sopenharmony_ci
349e41f4b71Sopenharmony_ci@Concurrent
350e41f4b71Sopenharmony_cifunction testPromiseError2() {
351e41f4b71Sopenharmony_ci  return new Promise<string>((resolve, reject) => {
352e41f4b71Sopenharmony_ci    reject("testPromiseError2 Error msg");
353e41f4b71Sopenharmony_ci  })
354e41f4b71Sopenharmony_ci}
355e41f4b71Sopenharmony_ci
356e41f4b71Sopenharmony_ciasync function testConcurrentFunc() {
357e41f4b71Sopenharmony_ci  let task1: taskpool.Task = new taskpool.Task(testPromiseError);
358e41f4b71Sopenharmony_ci  let task2: taskpool.Task = new taskpool.Task(testPromiseError1);
359e41f4b71Sopenharmony_ci  let task3: taskpool.Task = new taskpool.Task(testPromiseError2);
360e41f4b71Sopenharmony_ci
361e41f4b71Sopenharmony_ci  taskpool.execute(task1).then((d:object)=>{
362e41f4b71Sopenharmony_ci    console.info("task1 res is: " + d)
363e41f4b71Sopenharmony_ci  }).catch((e:object)=>{
364e41f4b71Sopenharmony_ci    console.info("task1 catch e: " + e)
365e41f4b71Sopenharmony_ci  })
366e41f4b71Sopenharmony_ci  taskpool.execute(task2).then((d:object)=>{
367e41f4b71Sopenharmony_ci    console.info("task2 res is: " + d)
368e41f4b71Sopenharmony_ci  }).catch((e:object)=>{
369e41f4b71Sopenharmony_ci    console.info("task2 catch e: " + e)
370e41f4b71Sopenharmony_ci  })
371e41f4b71Sopenharmony_ci  taskpool.execute(task3).then((d:object)=>{
372e41f4b71Sopenharmony_ci    console.info("task3 res is: " + d)
373e41f4b71Sopenharmony_ci  }).catch((e:object)=>{
374e41f4b71Sopenharmony_ci    console.info("task3 catch e: " + e)
375e41f4b71Sopenharmony_ci  })
376e41f4b71Sopenharmony_ci}
377e41f4b71Sopenharmony_ci
378e41f4b71Sopenharmony_ci@Entry
379e41f4b71Sopenharmony_ci@Component
380e41f4b71Sopenharmony_cistruct Index {
381e41f4b71Sopenharmony_ci  @State message: string = 'Hello World';
382e41f4b71Sopenharmony_ci
383e41f4b71Sopenharmony_ci  build() {
384e41f4b71Sopenharmony_ci    Row() {
385e41f4b71Sopenharmony_ci      Column() {
386e41f4b71Sopenharmony_ci        Button(this.message)
387e41f4b71Sopenharmony_ci          .fontSize(50)
388e41f4b71Sopenharmony_ci          .fontWeight(FontWeight.Bold)
389e41f4b71Sopenharmony_ci          .onClick(() => {
390e41f4b71Sopenharmony_ci            testConcurrentFunc();
391e41f4b71Sopenharmony_ci          })
392e41f4b71Sopenharmony_ci      }
393e41f4b71Sopenharmony_ci      .width('100%')
394e41f4b71Sopenharmony_ci    }
395e41f4b71Sopenharmony_ci    .height('100%')
396e41f4b71Sopenharmony_ci  }
397e41f4b71Sopenharmony_ci}
398e41f4b71Sopenharmony_ci```
399