鸿蒙 线程模型

前提:基于官网3.1/4.0文档。参考官网文档
基于Android开发体系来进行比较和思考。(或有偏颇,自行斟酌)

一、概念

HarmonyOS应用中每个进程都会有一个主线程,主线程有如下职责:

  1. 执行UI绘制; 管理主线程的ArkTS引擎实例,使多个UIAbility组件能够运行在其之上;
  2. 管理其他线程(例如Worker线程)的ArkTS引擎实例,例如启动和终止其他线程; 分发交互事件;
  3. 处理应用代码的回调,包括事件处理和生命周期管理; 接收Worker线程发送的消息;
  4. 除主线程外,还有一类与主线程并行的独立线程Worker,主要用于执行耗时操作,但不可以直接操作UI。Worker线程在主线程中创建,与主线程相互独立。最多可以创建8个Worker

主线程即UI 线程,通过Emitter进行线程间通信(类似Handler),用于主线程内及和Worker线程的事件同步。

Worker线程即工作线程,执行耗时任务。(这里明确指出来是用于耗时任务,实际上Android中新开线程可用于cpu计算、耗时等任务。不确定是否可以同样使用)

1.主线程

使用Emitter进行线程间通信

1.订阅
import emitter from "@ohos.events.emitter";// 定义一个eventId为1的事件
let event = {eventId: 1
};// 收到eventId为1的事件后执行该回调
let callback = (eventData) => {console.info('event callback');
};// 订阅eventId为1的事件
emitter.on(event, callback);
2.发送
import emitter from "@ohos.events.emitter";// 定义一个eventId为1的事件,事件优先级为Low
let event = {eventId: 1,priority: emitter.EventPriority.LOW
};let eventData = {data: {"content": "c","id": 1,"isEmpty": false,}
};// 发送eventId为1的事件,事件内容为eventData
emitter.emit(event, eventData);

eventId相当于msgId,用来区分消息。
事件优先级的说明是怎样的?

2.Worker线程

Worker是与主线程并行的独立线程。创建Worker的线程被称为宿主线程,Worker工作的线程被称为Worker线程。创建Worker时传入的脚本文件在Worker线程中执行,通常在Worker线程中处理耗时的操作,需要注意的是,Worker中不能直接更新Page。

如果宿主是UI 线程,那么该Worker线程是不是UI 线程?

1.配置

在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息。

  "buildOption": {"sourceOption": {"workers": ["./src/main/ets/workers/worker.ts"]}}
2.订阅及发送
import worker from '@ohos.worker';let wk = new worker.ThreadWorker("entry/ets/workers/worker.ts");// 发送消息到worker线程
wk.postMessage("message from main thread.")// 处理来自worker线程的消息
wk.onmessage = function(message) {console.info("message from worker: " + message)// 根据业务按需停止worker线程wk.terminate()
}

相较于UI线程,多了配置的一步。(猜测是为了减少包大小?但是这么重要的包,理论上应该要集成进SDK的,而不是依靠配置来引入。可能有其他原因。总体而言,多了一步就复杂了一些。)

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

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

相关文章

加速布局Wi-Fi及蓝牙市场!移远通信再推四款高性能模组新品

3月12日,全球领先的物联网整体解决方案供应商移远通信宣布,其已正式推出四款新型Wi-Fi和蓝牙模组新品,旨在继续致力于满足物联网行业不断升级的应用需求,为智慧家居、工业互联、储能、充电桩等各种场景提供一站式创新解决方案。 此…

Kotlin 空类型,区间,数组

目录 1. 空类型 2. 区间 3. 数组 1. 空类型 我们知道任何一种数据类型都有为空或不为空两种状态,在 Kotlin 中,若允许一个数据为空,则需要使用 "?",默认都不能为空。 代码举例说明 // 给 notNull赋值为空&#x…

LeetCode2864. Maximum Odd Binary Number

文章目录 一、题目二、题解 一、题目 You are given a binary string s that contains at least one ‘1’. You have to rearrange the bits in such a way that the resulting binary number is the maximum odd binary number that can be created from this combination.…

Linux(CentOS7.5):创建用户,并设置用户根目录及权限

一、背景说明 1、创建一个新用户:test_user。 2、该用户登录后,默认目录为:/opt/project,且仅可操作该目录。 3、该用户需要jdk的执行权限。 4、该用户需要nginx的使用权限。 5、设: jdk目录为:/opt/jdk/jd…

2023.5.9工作问题记录————安卓GKI检测abi-check

GKI ABI-check SOP ABI check是用于校验生成的kernel中ko与google释放的ko所计算出来的CRC是否相等。 在GKI版本中,很多kernel中的配置有y变成了m,编译成了ko,XTS测试时,会替换boot镜像, 替换成google释放的boot.img&…

Vue3组件详情

Vue3组件详情 一、父组件向子组件传值 ref、props二、子组件向父组件传值 emit三、子组件向父组件传值 v-model四、setup语法糖1、基本用法2、data和methods3、计算属性 computed4、监听器 watch、watchEffect5、自定义指令 directive6、import导入的内容可以直接使用7、声明pr…

Flume集成Kafka

之前提到Flume可以直接采集数据存储到HDFS中,那为什么还要引入Kafka这个中间件呢,这个是因为在实际应用场景中,我们既需要实时计算也需要离线计算。 Kfka to HDFS配置 # Name the components on this agent a1.sources r1 a1.sinks k1 a1.…

C#引用C++dll

参考:C#调用C的dll方法_c#调用cdll-CSDN博客 _stdcall与_cdecl区别 (QT 加载MFC的dll时,要注意的"_stdcall"或者CALLBACK的问题)_qt stdcall-CSDN博客 c#调用c的DLL的实现方法_C#教程_脚本之家 首先Cdll的制作 不论是使用Cbuilder还是vs…

动态规划7,等差数列划分,湍流子数组,唯一的子字符串,最长递增子序列

等差数列划分 思路: 经验题目要求 dp[i]表示:以 i 位置为结尾的所有子数组中有多少个等差数列 状态转移方程 对 dp[i] 位置,数列至少有三个元素,如果相邻三个为等差数列,dp[i] dp[i-1] 1; 如果相邻三个不为等差数…

c1月考测试

文章目录 月考技能2月1.某场100公里加速时间比赛中有摩托车,汽车,飞机等,现定义一个Runner类为参赛者,Runner类中增加成员变量加速时间acc_time,现要求使用Runner类实例化motor,car,airplane三个对象,输出比赛的第一名…

windows批处理脚本(cmd指令)

一、简介 最早期的电脑系统是DOS系统,DOS系统只有一个黑漆漆的窗口,需要自己输入命令,所以学习命令是很有必要的,那么CMD命令大全是什么?直到今天的Windows系统,还是离不开DOS命令的操作。如今懂得使用windows批处理脚…

【AI绘画教程】AI绘画图生图怎么用?

AI绘画技术已经越来越成熟,越来越多的人开始尝试利用AI进行创作。而AI绘画图生图作为一款优秀的AI绘画工具,正是帮助许多人创作的好帮手。 AI绘画图生图功能可以通过多种软件实现,具体的操作步骤可能因软件而异,但大体流程相似。以…

基于springboot+vue的会议室预约系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 随着互联网技术的发展,各行各业乃至人们的衣食住行都离不开网络。就拿最普普通通的衣食住行来说吧,穿衣服、买衣服我们现在基本都是在网络上进行购买,线下商场基本不去。…

身份证联网核查接口 Android身份证实名认证接口调用 二要素核验接口

身份证核验也就是核查身份证的真实性,虽然现有的技术越来越强,但是利益驱使下,不法分子也在想尽各种办法来利用非真实的身份证来实施违法行为。翔云身份证核验接口就可随时为用户提供核查身份证真伪的接口,让实名认证政策落地。 以…

实验二-写一个主程序来上机设计并验证线性表顺序表示的所有操作(至少包含算法2.3、2.4、2.5),并设计一个算法删除所有值大于min而且小于max的元素。

废话不多说&#xff0c;数据结构自己写代码见识了太多的bug&#xff0c;看来还是自己写代码的功夫不到家啊&#xff0c;进入正题。直接上代码。 #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 #define ERROR 0 #define OK 1 typedef int ElemType;…

维修住友注塑机 Sumitomo SE50D 工业液晶屏 SE50S工业电脑显示屏

Sumitomo (SHI) Demag 的 NC5 plus 控制器是一款易于使用的控制器&#xff0c;可帮助成型商实现卓越的注塑成型精度。 该控制器作为用户和注塑机之间的通信接口发挥着关键作用。只有通过控制才能访问机器的全部性能属性&#xff0c;从而以各种方式帮助最大限度地提高生产效率。…

1688商品详情数据采集(商品属性,规格,价格,详情图等)

京东商品详情数据采集是一个复杂但重要的过程&#xff0c;它涉及获取商品的详细信息&#xff0c;包括商品属性、规格、价格以及详情图等。以下是关于如何进行京东商品详情数据采集的基本步骤&#xff1a; 确定采集目标&#xff1a;首先&#xff0c;你需要明确需要采集的商品信…

tcp 连接数上限突破

连接数上限条件 文件句柄的限制 一个tcp连接就需要占用一个文件描述符&#xff0c;一旦文件描述符用完&#xff0c;新的连接就会返回给我们错误是&#xff1a;Can’topen so many files。linux系统出于安全角度的考虑&#xff0c;在多个维度对于可打开的文件描述符进行了限制…

unityAB包管理(远程下载)

1.AB包生成脚本 using UnityEngine; using UnityEditor; using System.IO; using System; using System.Collections.Generic;/// <summary> /// AB包创建 /// </summary> public class CreateAssetBundles : MonoBehaviour {public static string BuildAssetBund…

ARM 汇编指令:(五)CMP指令

目录 1.CMP比较指令 2.指令条件码 cond 1.CMP比较指令 CMP指令是计算机指令集中的一种比较指令&#xff0c;用于比较两个操作数的大小关系或相等性&#xff0c;并根据比较结果设置或更新条件码寄存器&#xff08;或程序状态字&#xff09;的标志位。 指令格式&#xff1a;C…