鸿蒙HarmonyOS实战-Stage模型(线程模型)

简介: 本文介绍了线程作为操作系统调度的最小单位,是进程中的执行流,具有轻量级、并发执行、共享资源、通信简单和上下文切换等特点。线程分为用户线程和内核线程,其中内核线程由操作系统管理,而用户线程由应用程序控制。线程用于提高程序性能和响应速度,尤其适合多任务并发处理。在HarmonyOS中,每个应用有主线程负责UI和 ArkTS 引擎管理,以及Worker线程执行耗时任务。线程间通信可通过Emitter实现事件同步和Worker进行异步操作。

🚀前言

线程是计算机中的一种执行单元,是操作系统进行调度的最小单位。它是进程中的实际运行单位,每个进程可以包含多个线程。线程可以理解为进程中的一个执行流,它独立运行,拥有独立的栈和寄存器,但共享进程的资源,如内存空间、文件等。线程通过并发执行,将一个进程的任务划分成多个子任务并行处理,以提高程序的性能和响应速度。

线程分为用户线程和内核线程。用户线程是由用户级线程库实现和调度的,操作系统并不直接支持用户线程,因此线程的创建、销毁、调度等都是由应用程序自己完成。内核线程则由操作系统内核管理,操作系统负责线程的创建、销毁和调度。内核线程相对于用户线程更加稳定和可靠,但创建和销毁线程的开销较大。

线程具有以下特点:

  1. 轻量级:线程创建和销毁的开销较小,所需的资源较少。
  2. 并发执行:多个线程可以同时执行,通过在不同的CPU核心上运行,充分利用多核处理器的性能。
  3. 共享资源:线程可以访问和共享进程的资源,如堆内存、全局变量、文件等。
  4. 通信简单:线程之间可以通过共享内存进行通信,也可以使用同步机制如互斥锁、信号量等进行协调和同步。
  5. 上下文切换:线程之间需要进行切换执行,由于线程的切换开销较小,因此可以快速响应和处理任务。

线程的使用可以有效地提高程序的性能和资源利用率,特别适用于多任务并发处理的场景,如网络服务器、图形界面应用、多媒体处理等。但线程编程也存在一些挑战和风险,如线程安全、共享资源竞争等问题,需要合理地设计和管理线程使用,以保证程序的正确性和稳定性。

🚀一、线程模型

🔎1.概述

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

  1. 执行UI绘制:主线程负责处理应用界面的绘制操作,包括布局、绘制和刷新等。
  2. 管理主线程的ArkTS引擎实例:主线程通过管理ArkTS引擎实例,使得多个UIAbility组件能够在主线程上运行,实现界面的展示和交互。
  3. 管理其他线程的ArkTS引擎实例:主线程还负责管理其他线程(例如Worker线程)的ArkTS引擎实例,包括启动和终止其他线程。
  4. 分发交互事件:主线程接收用户的交互事件,如点击、滑动等,并将这些事件分发给相应的UIAbility进行处理。
  5. 处理应用代码的回调:主线程负责处理应用代码的回调函数,包括事件处理和生命周期管理。例如,当用户触发某个事件时,主线程会调用相应的回调函数进行处理。
  6. 接收Worker线程发送的消息:主线程与Worker线程之间通过消息机制进行通信,主线程接收并处理Worker线程发送的消息。

除了主线程之外,还有一类与主线程并行的独立线程,称为Worker线程。Worker线程主要用于执行耗时操作,但不可以直接操作UI。Worker线程在主线程中创建,与主线程相互独立。一个进程最多可以创建8个Worker线程。

目前,HarmonyOS提供了两种线程间通信的方式,分别是Emitter和Worker。

  1. Emitter(发射器):Emitter主要适用于线程间的事件同步。它可以在不同的线程之间传递事件,并确保事件的顺序和同步性。通过Emitter,一个线程可以触发一个事件,然后其他线程可以监听并处理这个事件。这有助于不同线程之间的数据共享和协调。
  2. Worker(工作者):Worker主要用于新开一个线程执行耗时任务。当需要执行一些耗时操作时,为了不阻塞主任务的执行,可以使用Worker线程。Worker线程是在主线程的上下文中创建的独立线程,它可以执行一些耗时任务,如网络访问、文件读写等。工作线程可以与主线程并行执行,以提高应用的响应性和性能。

🔎2.Emitter

🦋2.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.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);

🔎3.Worker

🦋3.1 配置文件

以下配置文件都是在build-profile.json5中的

"buildOption": {
  "sourceOption": {
    "workers": [
      "./src/main/ets/workers/worker.ts"
    ]
  }
}

🦋3.2 创建文件

worker.ts文件

import worker from '@ohos.worker';
let parent = worker.workerPort;
// 处理来自主线程的消息
parent.onmessage = function(message) {
    console.info("onmessage: " + message)
    // 发送消息到主线程
    parent.postMessage("message from worker thread.")
}

🦋3.3 使用线程模型

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()
}
目录
打赏
0
0
0
0
255
分享
相关文章
鸿蒙HarmonyOS埋点SDK,ClkLog适配鸿蒙埋点分析
ClkLog鸿蒙埋点SDK通过手动埋点的方式实现HarmonyOS 原生应用的前端数据采集。快速接入即可获取埋点数据,同时支持分析功能(基础统计分析、自定义分析、用户画像等)。
126 59
HarmonyOS Next 实战卡片开发 03
本文详细介绍了基于 HarmonyOS Next 的卡片开发实战,涵盖从项目创建到功能实现的全流程。首先通过新建项目和服务卡片搭建基础框架,并设置沉浸式体验优化界面。接着实现了首页轮播图功能,包括申请网络权限、初始化数据和构建轮播组件。随后深入讲解了卡片 id 的处理,涉及获取、返回、持久化存储及移除操作,确保卡片与应用间的高效通信。此外,封装了下载图片工具类,支持卡片发起通知获取网络图片,增强功能扩展性。最后实现了卡片同步轮播功能,使首页与卡片轮播状态保持一致。整个流程注重细节,结合实际案例,为开发者提供了全面的参考。
87 20
HarmonyOS Next 实战卡片开发 03
|
2月前
HarmonyOS Next 实战卡片开发 02
本文介绍了 HarmonyOS Next 实战中卡片开发的图片显示技术,包括本地图片和网络图片的处理方法。对于本地图片,通过截图、选择图片、复制到临时目录并传递给卡片组件完成显示;而对于网络图片,则需申请网络权限,下载图片至本地后再按本地图片流程处理。文中详细展示了代码实现步骤与关键点,如使用 `PhotoViewPicker` 选择图片、`http` 下载网络资源以及通过 `formImages` 传递图片数据,确保图片在卡片中正确显示。
51 14
HarmonyOS Next 实战卡片开发 02
鸿蒙元服务实战-笑笑五子棋(5)
本文介绍了鸿蒙元服务实战项目“笑笑五子棋”的最后一部分,主要包括卡片制作与发布上架流程。通过 Form Kit 框架,实现静态与动态卡片的开发,详细讲解了卡片生命周期、功能页面设计及配置文件设置。文章还展示了如何完成卡片内的五子棋逻辑,包括绘制棋盘、处理落子和胜负判断等核心功能。最后,说明了发布上架的步骤,如设置图标、配置证书及打包 Hap 文件。附有参考链接和代码仓库,方便读者深入学习。至此,“笑笑五子棋”从开发到上线全流程完毕。
63 12
鸿蒙元服务实战-笑笑五子棋(5)
鸿蒙元服务实战-笑笑五子棋(1)
《笑笑五子棋》是基于鸿蒙系统开发的元服务应用,由深度开发者分享开源。名字源于开发者女儿“笑笑”,充满程序员的独特浪漫。应用采用 ArkTS API 12、Canvas 等技术,支持 AtomicServiceTabs 和卡片开发,已成功上架并获得基础激励。凭借活跃设备数达标,还登上鸿蒙负一屏休闲分类菜单,提升了用户活跃度。本文介绍了应用背景和技术细节,下篇将聚焦代码实现。适合对鸿蒙开发感兴趣的开发者学习交流。
64 10
鸿蒙元服务实战-笑笑五子棋(1)
|
2月前
|
鸿蒙元服务实战-笑笑五子棋(4)
本文介绍了基于鸿蒙元服务开发的“笑笑五子棋”项目第四部分的核心实现。主要涵盖五子棋的基本逻辑,包括沉浸式设计、AtomicServiceTabs组件使用、棋盘绘制、点击下棋逻辑以及输赢判断等功能。
53 8
鸿蒙元服务实战-笑笑五子棋(4)
鸿蒙元服务实战-笑笑五子棋(3)
本文是鸿蒙元服务实战系列的第三篇,围绕“笑笑五子棋”项目深入讲解了 Canvas 的高级用法。主要内容包括:`createPattern` 方法实现图片填充模板,支持多种重复方式如 `repeat`、`clamp` 和 `mirror`;绘制二次和三次贝塞尔曲线的路径方法 `quadraticCurveTo` 和 `bezierCurveTo`;以及通过 `ImageData` 对象操作像素数据,实现图像反色、黑白、亮度调整等特效。此外,还介绍了性能优化的马赛克效果实现技巧和渐变滤镜效果。结合代码示例与实际效果,帮助开发者掌握 Canvas 更多实用功能。
47 8
鸿蒙元服务实战-笑笑五子棋(3)
鸿蒙元服务实战-笑笑五子棋(2)
本章节主要讲解鸿蒙元服务的创建及Canvas图形绘制实战,以“笑笑五子棋”为例。内容涵盖在AGC平台和DevEco Studio中创建元服务工程的具体步骤,以及Canvas的基本使用方法,包括设置抗锯齿、创建画布上下文、渲染组件和描绘图案。此外,还详细介绍了Canvas常见用法,如直线、矩形、弧形、文本和图像的绘制,并展示了动态效果的实现方式。最后总结了Canvas的核心属性与方法。适合对鸿蒙开发感兴趣的开发者学习参考。
53 7
鸿蒙元服务实战-笑笑五子棋(2)
|
2月前
|
鸿蒙开发 HarmonyOS DevEco Studio 常用快捷键
本文介绍了 HarmonyOS开发中常用的 DevEco Studio快捷键,帮助开发者提升效率。内容涵盖编辑、查找替换、编译运行、调试及其他功能的快捷键操作,适用于 Win 和 Mac 系统。例如,`Ctrl + E`(快速切换文件)、`Shift + F10`(运行程序)和 `F8`(单步调试)等常用组合。由黑马程序员整理,欢迎补充或修正!
178 5
鸿蒙开发 HarmonyOS DevEco Studio 常用快捷键
HarmonyOS Next 实战卡片开发 01
本文详细介绍了 HarmonyOS Next 中的卡片开发,涵盖基本概念、类型、创建、配置、能力支持、生命周期及通信等内容。Form Kit 提供将应用重要信息前置到服务卡片的功能,减少跳转层级,适用于嵌入系统应用(如桌面),支持拉起页面与发送消息等交互。卡片分为静态与动态两种类型,分别适用于不同刷新需求场景。
53 0
HarmonyOS Next 实战卡片开发 01

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等