HarmonyOS 应用开发之同步任务开发指导 (TaskPool和Worker)

news/2024/7/21 8:47:43 标签: harmonyos, 华为, 移动开发, 鸿蒙开发

同步任务是指在多个线程之间协调执行的任务,其目的是确保多个任务按照一定的顺序和规则执行,例如使用锁来防止数据竞争。

同步任务的实现需要考虑多个线程之间的协作和同步,以确保数据的正确性和程序的正确执行。

由于TaskPool偏向于单个独立的任务,因此当各个同步任务之间相对独立时推荐使用TaskPool,例如一系列导入的静态方法,或者单例实现的方法。如果同步任务之间有关联性,则需要使用Worker,例如无法单例创建的类对象实现的方法。

使用TaskPool处理同步任务

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

  1. 定义并发函数,内部调用同步方法。

  2. 创建任务 Task ,通过 execute() 接口执行该任务,并对任务返回的结果进行操作。

  3. 执行并发操作。

模拟一个包含同步调用的单实例类。

// Handle.ts 代码
export default class Handle {
  static getInstance(): void {
    // 返回单例对象
  }

  static syncGet(): void {
    // 同步Get方法
  }

  static syncSet(num: number): number {
    // 模拟同步步骤1
    console.info("taskpool: this is 1st print!");
    // 模拟同步步骤2
    console.info("taskpool: this is 2nd print!");
    return num++;
  }
}

业务使用TaskPool调用相关同步方法的代码。

// Index.ets代码
import taskpool from '@ohos.taskpool';
import Handle from './Handle'; // 返回静态句柄

// 步骤1: 定义并发函数,内部调用同步方法
@Concurrent
function func(num: number): boolean {
  // 调用静态类对象中实现的同步等待调用
  Handle.syncSet(num);
  return true;
}

// 步骤2: 创建任务并执行
async function asyncGet(): Promise<void> {
  // 创建task并传入函数func
  let task: taskpool.Task = new taskpool.Task(func, 1);
  // 执行task任务
  let res: boolean = await taskpool.execute(task) as boolean;
  // 打印任务结果
  console.info("taskpool: task res is: " + res);
}

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            // 步骤3: 执行并发操作
            asyncGet();
          })
      }
      .width('100%')
      .height('100%')
    }
  }
}

使用Worker处理关联的同步任务

当一系列同步任务需要使用同一个句柄调度,或者需要依赖某个类对象调度,无法在不同任务池之间共享时,需要使用Worker。

  1. 在主线程中创建Worker对象,同时接收Worker线程发送回来的消息。
import worker from '@ohos.worker';

@Entry
@Component
struct Index {
  @State message: string = 'Hello World';

  build() {
    Row() {
      Column() {
        Text(this.message)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
          .onClick(() => {
            let w: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/MyWorker.ts');
            w.onmessage = (): void => {
              // 接收Worker子线程的结果
            }
            w.onerror = (): void => {
              // 接收Worker子线程的错误信息
            }
            // 向Worker子线程发送Set消息
            w.postMessage({'type': 0, 'data': 'data'})
            // 向Worker子线程发送Get消息
            w.postMessage({'type': 1})
            // ...
            // 根据实际业务,选择时机以销毁线程
            w.terminate()
          })
      }
      .width('100%')
    }
    .height('100%')
  }
}
  1. 在Worker线程中绑定Worker对象,同时处理同步任务逻辑。
// handle.ts代码
export default class Handle {
  syncGet() {
    return;
  }

  syncSet(num: number) {
    return;
  }
}

// MyWorker.ts代码
import worker, { ThreadWorkerGlobalScope, MessageEvents } from '@ohos.worker';
import Handle from './handle'  // 返回句柄

let workerPort : ThreadWorkerGlobalScope = worker.workerPort;

// 无法传输的句柄,所有操作依赖此句柄
let handler: Handle = new Handle()

// Worker线程的onmessage逻辑
workerPort.onmessage = (e : MessageEvents): void => {
 switch (e.data.type as number) {
  case 0:
   handler.syncSet(e.data.data);
   workerPort.postMessage('success set');
  case 1:
   handler.syncGet();
   workerPort.postMessage('success get');
 }
}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.
鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


http://www.niftyadmin.cn/n/5465819.html

相关文章

《c++》多态案例一.电脑组装

一.代码展示 #include <iostream> using namespace std; class CPU { public://抽象计算函数virtual void calculate() 0;};class CVideoCard { public://抽象显示函数virtual void display() 0;}; class Memory { public://抽象存储函数virtual void storage() 0;};…

Linux和Windows安装PHP依赖管理工具Composer

Composer 是 PHP 的一个依赖管理工具。它允许申明项目所依赖的代码库&#xff0c;会在项目中安装它们。 Composer 不是一个包管理器。是的&#xff0c;它涉及 "packages" 和 "libraries"&#xff0c;但它在每个项目的基础上进行管理&#xff0c;在你项目的…

代码审计与web安全:第一章作业

代码审计-第一章-作业 这门课的题目真是越来越抽象了 1.软件供应链安全的基础是(B ) A完善的需求分析 B源代码安全 C渗透测试 D软件测试 在软件开发中&#xff0c;确保源代码的安全性是至关重要的&#xff0c;因为它可以防止恶意代码的注入&#xff0c;从而保护整个供应链免受攻…

day3 wsl下启动第一个nest项目(java转ts全栈/3R教室)

背景&#xff1a;准备先找个nestjs模板项目&#xff08;kuizou大佬的nest-vben-admin&#xff09;看看大体情况&#xff0c;但发现win下还是问题还真挺多&#xff0c;受不了了今天一定要把wsl环境安装好。。。 比如如下明显就是win环境导致的错误&#xff0c;估计wsl下应该没问…

腾讯C++面试题分享

面试专栏&#xff1a;http://t.csdnimg.cn/0i089 目录 1.引言 2.分析 2.1.在C语言中定义一个全局变量&#xff0c;但不初始化&#xff0c;它默认的值是多少&#xff1f; 2.2.-2的源码&#xff0c;反码、补码分别是什么&#xff1f;-3呢&#xff1f;它的公式是什么&#xff…

国际贸易中的O/A付款方式及其风险管理 | 全球数字贸易发展联盟的作用

在复杂多变的国际贸易领域中&#xff0c;O/A&#xff08;Open Account&#xff09;付款方式作为一种常见的交易方式&#xff0c;既为买卖双方提供了灵活的操作空间&#xff0c;也带来了一定的风险。本文将对O/A付款方式进行深入探讨&#xff0c;并介绍全球数字贸易发展联盟如何…

<Linux> Linux环境开发工具

一、Linux软件包管理器 - yum 什么是软件包&#xff1a; 在Linux 下安装软件 , 一个通常的办法是下载到程序的源代码 , 并进行编译 , 得到可执行程序 . 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好 , 做成软件包 ( 可以理解成 windows 上的安装程序) 放在一…

实在智能Agent亮相中国移动数字员工“赋智计划”

围绕国家战略深入开展科技创新&#xff0c;是中国移动的重要使命。为了充分响应十四届全国人大二次会议精神&#xff0c;深化实施“人工智能”行动计划&#xff0c;全力贯彻集团公司对于“AI”全方位智慧赋能的战略部署&#xff0c;中国移动集团公司近日在广州南方基地盛大召开…