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 会存在资源不能及时更新问题。本文章会对这些问题进行优化。 优化打包产物体积 从打包产物中可以看到其中 …

Java 8使用Stream流去除一个list中包含另一个list已存在的某个字段的对象

项目场景&#xff1a; 在Java中&#xff0c;我们经常会遇到需要对List中的数据进行操作的情况。有时候&#xff0c;我们需要从一个List中删除另一个List已经包含的数据。这种情况下&#xff0c;我们可以使用Java Stream来简洁高效地完成操作。 代码示例 假设我们有两个对象列表…

哪些产品可以做FSC森林认证?

FSC森林认证 FSC即森林管理委员会&#xff08;FSC-Forest Stewardship Council&#xff09;的英文缩写&#xff0c;一些民间环保组织、非政府组织以及社会责任感强的企业共同发起并逐渐形成了森林认证。 FSC认证是森林认证&#xff0c;又叫木材认证或统称为认证&#xff0c;是一…

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

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

前端导出PDF的组件及方法

前端导出PDF的组件及方法 在Web应用程序中&#xff0c;导出PDF文件是一项常见的需求。无论是为了打印、分享还是存档&#xff0c;能够将网页内容转换为PDF格式都非常有用。幸运的是&#xff0c;前端开发者有多种方法和组件可以实现这一功能。在本文中&#xff0c;我们将详细介…

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

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

UDP Ping程序实现

第1关:Ping服务端创建UDP套接字 # UDPPingerServer.py from socket import * ########## Begin ##########serverSocket = socket(AF_INET, SOCK_DGRAM) serverSocket.bind(("0.0.0.0",12000)) ########## End ##########print( serverSocket) 第2关:接收并转发…

【大模型】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 使用对话方式创…

南海信息学竞赛高频考查点系列-1枚举2下标记数3部分和

这套题包含了历年真题&#xff0c;十分重要&#xff01;&#xff01;&#xff01;&#xff01;要考试的同学可以参考一下&#xff01;&#xff01; 此套题限时3小时。 #A. C05.L05.枚举及优化&#xff08;二&#xff09;.课堂练习4.线段覆盖 题目描述 在一条数轴上&#xf…

【最后203篇系列】001 - 2024回顾

说明 最早在CSDN上写文章有两个目的&#xff1a; 1 自己梳理知识&#xff0c;以备日后查用2 曾经从别人的文章中得到过帮助&#xff0c;所以也希望能给人帮助 所以在这个过程中&#xff0c;我的文章基本上完全是原创&#xff0c;也非常强调落地与工程化。在不断写作的过程中…

地理数据库Telepg面试内容整理-基础技术栈

以下是围绕 Telepg地理数据库 的基础技术栈详细整理,包括数据库技术、空间索引、数据格式、查询与优化、开发语言与框架等内容,帮助构建与地理信息系统(GIS)相关的全面知识体系。 数据库技术 (1) 关系型数据库 ● PostgreSQL: ○

Java旅程(五)Spring 框架与微服务架构 了解 JVM 内部原理和调优

在现代企业级应用中&#xff0c;Spring 框架和微服务架构已经成为主流技术&#xff0c;而 Java 虚拟机&#xff08;JVM&#xff09;的理解和调优对于保证应用的高性能和稳定性也至关重要。本篇博客将深入讲解 Spring 框架与微服务架构&#xff0c;并进一步探讨 JVM 内部原理和调…

java后端传时间戳给前端的三种方式

一. 后端传时间戳给前端的几种方式 使用System.currentTimeMillis() 这是最简单的方式&#xff0c;返回自1970年1月1日&#xff08;UTC&#xff09;以来的毫秒数&#xff0c;可以直接传递给前端。 long timestamp1 System.currentTimeMillis();使用java.time.Instant Java…

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…

如何在K8S集群中查看和操作Pod内的文件?

文章目录 一、理解Kubernetes中的Pod二、查看Pod内的文件三、操作Pod内的文件四、高级技巧五、常见问题与解决方案 在Kubernetes&#xff08;K8s&#xff09;集群中&#xff0c;Pod是最小的可部署单元&#xff1b; 一、理解Kubernetes中的Pod 在Kubernetes中&#xff0c;Pod是…

Zed调试宏 C语言错误日志 异常错误调试信息

1、C中的错误码 在C语言中通过返回错误码或设置全局的errno值来反馈错误问题。errno.h是一个头文件&#xff0c;它定义了一个全局变量errno&#xff0c;用于在程序中记录和报告错误的原因。这个机制主要用于处理系统调用或标准库函数出错时的错误反馈。当系统调用或库函数…