鸿蒙ArkTS实战开发:同步使命 (TaskPool和Worker)

莱莱  论坛元老 | 2024-8-15 02:40:10 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1028|帖子 1028|积分 3084

同步使命是指在多个线程之间协调实行的使命,其目的是确保多个使命按照肯定的顺序和规则实行,比方使用锁来防止数据竞争。
同步使命的实现必要思量多个线程之间的协作和同步,以确保数据的正确性和步伐的正确实行。
由于TaskPool偏向于单个独立的使命,因此当各个同步使命之间相对独立时推荐使用TaskPool,比方一系列导入的静态方法,大概单例实现的方法。如果同步使命之间有关联性,则必要使用Worker,比方无法单例创建的类对象实现的方法。
使用TaskPool处理同步使命

当调度独立的使命,大概一系列使命为静态方法实现,大概可以通过单例构造唯一的句柄或类对象,可在差异使命线程之间使用时,推荐使用TaskPool。

  • 定义并发函数,内部调用同步方法。
  • 创建使命Task,通过execute()接口实行该使命,并对使命返回的结果进行操纵。
  • 实行并发操纵。
模拟一个包含同步调用的单实例类。
  1. // Handle.ts 代码
  2. export default class Handle {
  3.   static getInstance(): void {
  4.     // 返回单例对象
  5.   }
  6.   static syncGet(): void {
  7.     // 同步Get方法
  8.   }
  9.   static syncSet(num: number): number {
  10.     // 模拟同步步骤1
  11.     console.info("taskpool: this is 1st print!");
  12.     // 模拟同步步骤2
  13.     console.info("taskpool: this is 2nd print!");
  14.     return num++;
  15.   }
  16. }
复制代码
业务使用TaskPool调用相干同步方法的代码。
  1. // Index.ets代码
  2. import taskpool from '@ohos.taskpool';
  3. import Handle from './Handle'; // 返回静态句柄
  4. // 步骤1: 定义并发函数,内部调用同步方法
  5. @Concurrent
  6. function func(num: number): boolean {
  7.   // 调用静态类对象中实现的同步等待调用
  8.   Handle.syncSet(num);
  9.   return true;
  10. }
  11. // 步骤2: 创建任务并执行
  12. async function asyncGet(): Promise<void> {
  13.   // 创建task并传入函数func
  14.   let task: taskpool.Task = new taskpool.Task(func, 1);
  15.   // 执行task任务
  16.   let res: boolean = await taskpool.execute(task) as boolean;
  17.   // 打印任务结果
  18.   console.info("taskpool: task res is: " + res);
  19. }
  20. @Entry
  21. @Component
  22. struct Index {
  23.   @State message: string = 'Hello World';
  24.   build() {
  25.     Row() {
  26.       Column() {
  27.         Text(this.message)
  28.           .fontSize(50)
  29.           .fontWeight(FontWeight.Bold)
  30.           .onClick(() => {
  31.             // 步骤3: 执行并发操作
  32.             asyncGet();
  33.           })
  34.       }
  35.       .width('100%')
  36.       .height('100%')
  37.     }
  38.   }
  39. }
复制代码
使用Worker处理关联的同步使命

当一系列同步使命必要使用同一个句柄调度,大概必要依赖某个类对象调度,无法在差异使命池之间共享时,必要使用Worker。

  • 在主线程中创建Worker对象,同时接收Worker线程发送回来的消息。
    1. import worker from '@ohos.worker';
    2. @Entry
    3. @Component
    4. struct Index {
    5.   @State message: string = 'Hello World';
    6.   build() {
    7.     Row() {
    8.       Column() {
    9.         Text(this.message)
    10.           .fontSize(50)
    11.           .fontWeight(FontWeight.Bold)
    12.           .onClick(() => {
    13.             let w: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
    14.             w.onmessage = (): void => {
    15.               // 接收Worker子线程的结果
    16.             }
    17.             w.onerror = (): void => {
    18.               // 接收Worker子线程的错误信息
    19.             }
    20.             // 向Worker子线程发送Set消息
    21.             w.postMessage({'type': 0, 'data': 'data'})
    22.             // 向Worker子线程发送Get消息
    23.             w.postMessage({'type': 1})
    24.             // ...
    25.             // 根据实际业务,选择时机以销毁线程
    26.             w.terminate()
    27.           })
    28.       }
    29.       .width('100%')
    30.     }
    31.     .height('100%')
    32.   }
    33. }
    复制代码
  • 在Worker线程中绑定Worker对象,同时处理同步使命逻辑。
    1. // handle.ts代码
    2. export default class Handle {
    3.   syncGet() {
    4.     return;
    5.   }
    6.   syncSet(num: number) {
    7.     return;
    8.   }
    9. }
    复制代码
    1. // MyWorker.ts代码
    2. import worker, { ThreadWorkerGlobalScope, MessageEvents } from '@ohos.worker';
    3. import Handle from './handle'  // 返回句柄
    4. let workerPort : ThreadWorkerGlobalScope = worker.workerPort;
    5. // 无法传输的句柄,所有操作依赖此句柄
    6. let handler: Handle = new Handle()
    7. // Worker线程的onmessage逻辑
    8. workerPort.onmessage = (e : MessageEvents): void => {
    9. switch (e.data.type as number) {
    10.   case 0:
    11.    handler.syncSet(e.data.data);
    12.    workerPort.postMessage('success set');
    13.   case 1:
    14.    handler.syncGet();
    15.    workerPort.postMessage('success get');
    16. }
    17. }
    复制代码
最后

有许多小伙伴不知道学习哪些鸿蒙开发技术?不知道必要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习黑白常有须要的。 
这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了ArkTS、ArkUI开发组件、Stage模子、多端摆设、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。
渴望这一份鸿蒙学习资料可以或许给各人带来帮助,有必要的小伙伴自行领取,限时开源,先到先得~无套路领取!!
如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员,可以直接领取这份资料
 获取这份完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
鸿蒙(HarmonyOS NEXT)最新学习路线




  •  HarmonOS基础技能



  • HarmonOS就业必备技能 

  •  HarmonOS多媒体技术



  • 鸿蒙NaPi组件进阶



  • HarmonOS高级技能



  • 初识HarmonOS内核 

  • 实战就业级装备开发

 有了路线图,怎么能没有学习资料呢,小编也准备了一份联合鸿蒙官方发布笔记整理收纳的一套系统性的鸿蒙(OpenHarmony )学习手册(共计1236页)鸿蒙(OpenHarmony )开发入门讲授视频,内容包含:ArkTS、ArkUI、Web开发、应用模子、资源分类…等知识点。
获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料
《鸿蒙 (OpenHarmony)开发入门讲授视频》


《鸿蒙生态应用开发V2.0白皮书》


《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

 《鸿蒙开发基础》



  • ArkTS语言
  • 安装DevEco Studio
  • 运用你的第一个ArkTS应用
  • ArkUI声明式UI开发
  • .……

 《鸿蒙开发进阶》



  • Stage模子入门
  • 网络管理
  • 数据管理
  • 电话服务
  • 分布式应用开发
  • 关照与窗口管理
  • 多媒体技术
  • 安全技能
  • 使命管理
  • WebGL
  • 国际化开发
  • 应用测试
  • DFX面向将来设计
  • 鸿蒙系统移植和裁剪定制
  • ……

《鸿蒙进阶实战》



  • ArkTS实践
  • UIAbility应用
  • 网络案例
  • ……

 获取以上完整鸿蒙HarmonyOS学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料
总结

总的来说,华为鸿蒙不再兼容安卓,对中年步伐员来说是一个挑衅,也是一个机会。只有积极应对变化,不停学习和提升自己,他们才能在这个变革的时代中立于不败之地。 



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表