• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 异步等待
2
3ArkTS引入了异步等待通知能力,以解决多线程任务时序控制问题。异步等待通知[ConditionVariable](../reference/apis-arkts/js-apis-arkts-utils.md#conditionvariable18)对象支持跨线程引用传递。
4
5由于ArkTS语言支持异步操作,现在增加了异步任务的等待和被唤醒功能。当收到唤醒通知或等待超时后,异步任务将继续执行。
6
7> **说明:**
8>
9> 使用异步等待的方法需标记为async,调用时需用await修饰,以确保时序正确。
10
11## 使用示例
12
13[Sendable](arkts-sendable.md)共享对象在不同线程控制异步任务等待和唤醒的示例如下:
14
15```ts
16import { ArkTSUtils, taskpool } from '@kit.ArkTS';
17
18@Concurrent
19function notifyAll(conditionVariable: ArkTSUtils.locks.ConditionVariable) {
20  conditionVariable.notifyAll();
21}
22
23@Concurrent
24function notifyOne(conditionVariable: ArkTSUtils.locks.ConditionVariable) {
25  conditionVariable.notifyOne();
26}
27
28@Concurrent
29async function wait(conditionVariable: ArkTSUtils.locks.ConditionVariable) {
30  await conditionVariable.wait().then(() => {
31    console.log(`TaskPool Thread Wait: success`);
32  });
33}
34
35@Concurrent
36async function waitFor(conditionVariable: ArkTSUtils.locks.ConditionVariable) {
37  await conditionVariable.waitFor(3000).then(() => {
38    console.log(`TaskPool Thread WaitFor: success`);
39  });
40}
41
42@Entry
43@Component
44struct Index {
45  @State message: string = 'Hello World';
46
47  build() {
48    Row() {
49      Column() {
50        Text(this.message)
51          .fontSize(50)
52          .fontWeight(FontWeight.Bold)
53          .onClick(() => {
54            // 创建conditionVariableR对象
55            const conditionVariable: ArkTSUtils.locks.ConditionVariable = new ArkTSUtils.locks.ConditionVariable();
56            // 将实例conditionVariable传递给wait线程
57            taskpool.execute(wait, conditionVariable);
58            // 将实例conditionVariable传递给notify线程,唤醒wait线程,日志输出"TaskPool Thread Wait: success"
59            taskpool.execute(notifyAll, conditionVariable);
60            // 将实例conditionVariable传递给waitFor线程
61            taskpool.execute(waitFor, conditionVariable);
62            // 将实例conditionVariable传递给notifyOne线程,唤醒waitFor线程,日志输出"TaskPool Thread WaitFor: success"
63            taskpool.execute(notifyOne, conditionVariable);
64
65            // 创建有name的conditionVariable对象
66            const conditionVariableRequest: ArkTSUtils.locks.ConditionVariable =
67                ArkTSUtils.locks.ConditionVariable.request("Request1");
68            // 将实例conditionVariableRequest传递给wait线程
69            taskpool.execute(wait, conditionVariableRequest);
70            // 将实例conditionVariableRequest传递给notify线程,唤醒wait线程,日志输出"TaskPool Thread Wait: success"
71            taskpool.execute(notifyAll, conditionVariableRequest);
72            // 将实例conditionVariableRequest传递给waitFor线程
73            taskpool.execute(waitFor, conditionVariableRequest);
74            // 将实例conditionVariableRequest传递给notifyOne线程,唤醒waitFor线程,日志输出"TaskPool Thread WaitFor: success"
75            taskpool.execute(notifyOne, conditionVariableRequest);
76          })
77      }
78      .width('100%')
79    }
80    .height('100%')
81  }
82}
83```
84