HarmonyOs:创建线程的3种方式

使用Worker创建线程

  • 基本概念:Worker主要为应用程序提供多线程运行环境,可让应用程序在执行过程中与宿主线程分离,在后台线程中运行脚本进行耗时操作,避免计算密集型或高延迟任务阻塞宿主线程。
  • 使用方法
    • 创建Worker线程文件:Worker线程文件需要放在{moduleName}/src/main/ets/目录层级之下。可以手动创建相关目录及文件,并配置build-profile.json5的相关字段信息;也可以使用DevEco Studio一键生成Worker,自动生成模板文件及配置信息。
    • 构造Worker实例:根据不同的API版本和模型,使用相应的构造函数传入Worker线程文件的路径来创建worker.ThreadWorkerworker.Worker实例。例如,在API 9及之后版本的Stage模型下,如果worker线程文件所在路径为"entry/src/main/ets/workers/worker.ets",则可以这样创建:const workerStage1: worker.ThreadWorker = new worker.ThreadWorker('entry/ets/workers/worker.ets');
    • 通信与任务执行:在宿主线程和Worker子线程中通过onmessagepostMessage方法进行消息传递,以实现数据交互和任务执行。
  • 注意事项
    • 需要手动管理Worker的生命周期,且最多同时运行的Worker子线程数量为64个。当不需要Worker时,应调用terminate()接口或close()方法主动销毁Worker,避免资源浪费。
    • 使用Worker模块时,需要在宿主线程中注册onerror接口,否则当Worker线程出现异常时会发生jscrash问题。
    • 不支持跨HAP使用Worker线程文件,引用HAR/HSP前,需要先配置对HAR/HSP的依赖。

使用TaskPool创建线程

  • 基本概念:TaskPool为应用程序提供多线程运行环境,能降低资源消耗、提升系统性能,开发者无需关心线程实例的生命周期。它支持在宿主线程封装任务并抛给任务队列,系统会选择合适的工作线程进行任务分发与执行,并将结果返回给宿主线程。
  • 使用方法
    • 定义任务函数:使用@Concurrent装饰器标注要在任务池中执行的函数。该装饰器从API version 9开始支持,仅在Stage模型的工程中的.ets文件中使用。被装饰的函数可以是async函数或普通函数,但禁止是generator、箭头函数、类方法,也不支持类成员函数或者匿名函数。函数内允许使用local变量、入参和通过import引入的变量,禁止使用闭包变量。
    • 创建任务并执行:在需要执行并发任务的地方,创建taskpool.Task对象,将定义好的任务函数作为参数传入,并通过taskpool.execute方法执行任务。例如:
import { taskpool } from '@kit.ArkTS';@Concurrent
function add(num1: number, num2: number): number {return num1 + num2;
}async function ConcurrentFunc(): Promise<void> {try {let task: taskpool.Task = new taskpool.Task(add, 1, 2);console.info("taskpool res is: " + await taskpool.execute(task));} catch (e) {console.error("taskpool execute error is: " + e);}
}@Entry
@Component
struct Index {@State message: string = 'Hello World';build() {Row() {Column() {Text(this.message).fontSize(50).fontWeight(FontWeight.Bold).onClick(() => {ConcurrentFunc();})}.width('100%')}.height('100%')}
}
  • 注意事项
    • 任务函数在TaskPool工作线程的执行耗时不能超过3分钟(不包含Promiseasync/await异步调用的耗时,例如网络下载、文件读写等I/O任务的耗时),否则会被强制退出。
    • 实现任务的函数入参需满足序列化支持的类型。ArrayBuffer参数在TaskPool中默认转移,需要设置转移列表的话可通过接口setTransferList()设置。
    • 从API version 11开始,跨并发实例传递带方法的实例对象时,该类必须使用@Sendable装饰器标注,且仅支持在.ets文件中使用。

通过NAPI机制在C代码中使用标准线程API创建线程

  • 基本概念:通过NAPI(Native API)机制,可以在C代码中使用标准的线程API来创建线程,直接利用操作系统提供的线程创建和管理功能,实现更底层的线程控制。
  • 使用方法:通常使用pthread_create函数来创建线程,其函数原型为int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);。例如:
#include <pthread.h>// 线程执行的函数
void *CreateArkRuntimeFunc(void *arg) {// 线程执行的代码逻辑return NULL;
}int main() {pthread_t tid;// 创建线程pthread_create(&tid, nullptr, CreateArkRuntimeFunc, nullptr);// 其他代码逻辑// 等待线程结束等操作pthread_join(tid, NULL);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DataV的安装与使用(Vue3版本)

1、DataV(vue3)地址&#xff1a;DataV Vue3TSVite版 | DataV - Vue3 2、使用 npm install kjgl77/datav-vue3 安装 3、全局引入。 4、此时就可以按需使用了~

云原生服务网格Istio实战

基础介绍 1、Istio的定义 Istio 是一个开源服务网格&#xff0c;它透明地分层到现有的分布式应用程序上。 Istio 强大的特性提供了一种统一和更有效的方式来保护、连接和监视服务。 Istio 是实现负载平衡、服务到服务身份验证和监视的路径——只需要很少或不需要更改服务代码…

Flutter web - 5 项目打包优化

介绍 目前 flutter 对 web 的打包产物优化较少&#xff0c;存在 main.dart.js 单个文件体积过大问题&#xff0c;打包文件名没有 hash 值&#xff0c;如果有使用 CDN 会存在资源不能及时更新问题。本文章会对这些问题进行优化。 优化打包产物体积 从打包产物中可以看到其中 …

KingbaseES(金仓数据库)入门学习

前言 金仓是一种多进程架构&#xff0c;每一个连接到服务器的会话&#xff0c;在服务器上面都会为该会话分配进程 图形化界面管理 新建数据库名 然后新建一个模式 再创建一个表 新建一个表&#xff0c;然后设置列名 记得要保存 查询数据 也可以新建数据表&#xff0c;用命令…

基于Springboot的数字科技风险报告管理系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的设计程序开发&#xff0c;开发过上千套设计程序&#xff0c;没有什么华丽的语言&#xff0c;只有实…

【大模型】ChatGPT 打造个人专属GPTs助手使用详解

目录 一、前言 二、GPTs介绍 2.1 GPTs是什么 2.2 GPTs工作原理 2.3 GPTs 主要功能 2.4 GPTs 应用场景 2.5 GPTs 优缺点 三、GPTs 创建个人专属应用操作过程 3.1 内置GPTs模板 3.1.1 内置GPTs使用过程 3.2 手动配置方式创建 GPTs 3.2.1 创建过程 3.3 使用对话方式创…

Cobalt Strike 4.8 用户指南-第十四节 Aggressor 脚本

14.1、什么是Aggressor脚本 Aggressor Script 是Cobalt Strike 3.0版及更高版本中内置的脚本语言。Aggressor 脚本允许你修改和扩展 Cobalt Strike 客户端。 历史 Aggressor Script 是 Armitage 中开源脚本引擎Cortana的精神继承者。Cortana 是通过与 DARPA 的网络快速跟踪计…

Vue(四)

1.Vuex 1.1 Vuex是什么 Vuex 是一个插件&#xff0c;可以帮我们管理 Vue 通用的数据。例如&#xff1a;购物车数据、个人信息数据。 1.2 vuex的使用 1.安装 vuex 安装 vuex 与 vue-router 类似&#xff0c;vuex 是一个独立存在的插件&#xff0c;如果脚手架初始化没有选 v…

基础9 CRTP 与 Expression Templates

目录 一、奇异递归模版(CRTP) 二、表达式模板 &#x1f349; 概要 &#x1f347; 奇异递归模板模式&#xff08;CRTP&#xff09; 动机与原理 &#x1f353; 表达式模板&#xff08;Expression Templates&#xff09; 动机与原理 &#x1f348; 示例代码 &#x1f35…

分布式协同 - 分布式事务_TCC解决方案

文章目录 导图Pre流程图2PC VS 3PC VS TCC2PC&#xff08;Two-Phase Commit&#xff0c;二阶段提交&#xff09;3PC&#xff08;Three-Phase Commit&#xff0c;三阶段提交&#xff09;TCC&#xff08;Try-Confirm-Cancel&#xff09;2PC、3PC与TCC的区别2PC、3PC与TCC的联系 导…

脑肿瘤检测数据集,对9900张原始图片进行YOLO,COCO,VOC格式的标注

脑肿瘤检测数据集&#xff0c;对9900张原始图片进行YOLO&#xff0c;COCO&#xff0c;VOC格式的标注 数据集分割 训练组 70&#xff05; 6930图片 有效集 20&#xff05; 1980图片 测试集 10&#xff05; 990图片 预处理 静态裁剪&#xff1a; 24-82&…

步进电机接线和stm32引脚分配

实验设备 24v&#xff08;12-48 v&#xff09;直流电源 stm32f103最小系统板 步进电机驱动器 采用混合式二相步进电机J-5718HBS2401-野火42步进电机&#xff0c;驱动器为野火EBF-MSD4805 本人参考接线方式如下&#xff1a; 如上图所示通常采用共阴接线方式&#xff0c;具体…

极乐 15.2.6 | 清爽版简约美观音乐软件,支持网易云歌单导入

极乐是一款使用起来非常轻松的音乐播放软件&#xff0c;它拥有清新简洁的画面&#xff0c;专注于音乐播放功能。最新版本全面升级了64位架构&#xff0c;带来了前所未有的性能提升和更稳定的体验。通过优化内存管理&#xff0c;降低了应用对系统资源的占用&#xff0c;确保设备…

4、mysql高阶语句

mysql高阶语句是对复杂的条件进行查询的操作。 排序—order by 加了desc表示由大到小 1、查询name和score&#xff0c;地址都是云南西路的按id进行由小到大排序 2、查询name和score&#xff0c;先按hobbid进行排序&#xff0c;再把结果按id进行排序 第一段字段必须要有相同的…

Docker部署GitLab服务器

一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台&#xff0c;集成了版本控制、代码审查、问题跟踪、持续集成与持续交付&#xff08;CI/CD&#xff09;等多种功能&#xff0c;旨在为团队提供一站式的项目管理解决方案。借助 GitLab&#xff0c;开发…

hadoop中hive本地模式安装mysql源不成功

目录 1.更改DNS配置 2.替换yun源 3.替换掉后&#xff0c;在执行 4.重新安装mysql源 hive本地模式安装mysql源出错 yum install mysql mysql-server mysql-devel -y 解决&#xff1a; 1.更改DNS配置 vi /etc/resolv.conf 添加下面内容&#xff1a; nameserver 8.8.8.8 …

RISC-V架构的压缩指令集介绍

1、压缩指令集介绍 RISC-V的压缩指令集&#xff08;C扩展&#xff09;‌是一种设计用于减少代码大小和提高性能的技术。标准的RISC-V指令是32位&#xff0c;压缩指令集可以将部分32位的指令用16位的指令替代&#xff0c;从未减小程序占用存储空间的大小&#xff0c;提高指令密…

Day13 苍穹外卖项目 工作台功能实现、Apache POI、导出数据到Excel表格

目录 1.工作台 1.1 需求分析和设计 1.1.1 产品原型 1.1.2 接口设计 1.2 代码导入 1.2.1 Controller层 1.2.2 Service层接口 1.2.3 Service层实现类 1.2.4 Mapper层 1.3 功能测试 1.4 代码提交 2.Apache POI 2.1 介绍 2.2 入门案例 2.2.1 将数据写入Excel文件 2.2.2 读取Excel文…

集星獭 | 高性能编排:为实时数据集成而生!

概要介绍 服务编排作为集星獭驱动业务流、数据流中不可或缺的重要环节&#xff0c;其基于分布式架构打造&#xff0c;提供了高可用、易扩展的可视化流程任务调度功能。 原服务编排的设计初衷是专注于任务调度&#xff0c;提供高性能任务调度&#xff0c;但是在实时调用方面的…

达梦8-达梦数据的示例用户和表

1、示例库说明&#xff1a; 创建达梦数据的示例用户和表&#xff0c;导入测试数据。 在完成达梦数据库的安装之后&#xff0c;在/opt/dmdbms/samples/instance_script目录下有用于创建示例用户的SQL文件。samples目录前的路径根据实际安装情况进行修改&#xff0c;本文将达梦…