文档管理中心

异步等待

本文导读

ArkTS引入了异步任务的等待和唤醒能力,以解决多线程任务时序控制问题。异步任务通过ConditionVariable对象实现等待和唤醒机制,该对象支持跨线程引用传递。

ArkTS语言支持异步操作,从API version 18开始支持异步任务的等待和唤醒功能。当异步任务收到唤醒通知或等待超时后,将继续执行。

说明

使用异步方法需标记为async,调用时可用await修饰,确保时序正确。

使用示例

Sendable共享对象在不同线程控制异步任务等待和唤醒的示例如下:

收起
自动换行
深色代码主题
复制
  1. import { ArkTSUtils, taskpool } from '@kit.ArkTS';
  2. @Concurrent
  3. function notifyAll(conditionVariable: ArkTSUtils.locks.ConditionVariable) {
  4. console.info(`TaskPool Thread notifyAll`);
  5. conditionVariable.notifyAll();
  6. }
  7. @Concurrent
  8. function notifyOne(conditionVariable: ArkTSUtils.locks.ConditionVariable) {
  9. console.info(`TaskPool Thread notifyOne`);
  10. conditionVariable.notifyOne();
  11. }
  12. @Concurrent
  13. async function wait(conditionVariable: ArkTSUtils.locks.ConditionVariable) {
  14. await conditionVariable.wait();
  15. console.info(`TaskPool Thread Wait: success`);
  16. }
  17. @Concurrent
  18. async function waitFor(conditionVariable: ArkTSUtils.locks.ConditionVariable) {
  19. await conditionVariable.waitFor(3000);
  20. console.info(`TaskPool Thread WaitFor: success`);
  21. }
  22. @Entry
  23. @Component
  24. struct Index {
  25. @State message: string | ResourceStr = $r('app.string.AsyncButton'); // 加载资源,可根据项目实际资源自定义
  26. build() {
  27. Row() {
  28. Column() {
  29. Button(this.message)
  30. .fontSize(25)
  31. .fontWeight(FontWeight.Bold)
  32. .onClick(async () => {
  33. // 创建conditionVariable对象。
  34. const conditionVariable: ArkTSUtils.locks.ConditionVariable = new ArkTSUtils.locks.ConditionVariable();
  35. // 将实例conditionVariable传递给wait线程。
  36. taskpool.execute(wait, conditionVariable);
  37. // 将实例conditionVariable传递给notifyAll线程,唤醒wait线程,日志输出"TaskPool Thread Wait: success"。
  38. await taskpool.execute(notifyAll, conditionVariable);
  39. // 将实例conditionVariable传递给waitFor线程。
  40. taskpool.execute(waitFor, conditionVariable);
  41. // 将实例conditionVariable传递给notifyOne线程,唤醒waitFor线程,日志输出"TaskPool Thread WaitFor: success"。
  42. await taskpool.execute(notifyOne, conditionVariable);
  43. // 创建有name的conditionVariable对象。
  44. const conditionVariableRequest: ArkTSUtils.locks.ConditionVariable =
  45. ArkTSUtils.locks.ConditionVariable.request('Request1');
  46. // 将实例conditionVariableRequest传递给wait线程。
  47. taskpool.execute(wait, conditionVariableRequest);
  48. // 将实例conditionVariableRequest传递给notifyAll线程,唤醒wait线程,日志输出"TaskPool Thread Wait: success"。
  49. await taskpool.execute(notifyAll, conditionVariableRequest);
  50. // 将实例conditionVariableRequest传递给waitFor线程。
  51. taskpool.execute(waitFor, conditionVariableRequest);
  52. // 将实例conditionVariableRequest传递给notifyOne线程,唤醒waitFor线程,日志输出"TaskPool Thread WaitFor: success"。
  53. await taskpool.execute(notifyOne, conditionVariableRequest);
  54. })
  55. }
  56. .width('100%')
  57. }
  58. .height('100%')
  59. }
  60. }
在 指南 中进行搜索
请输入您想要搜索的关键词