HarmonyOS鸿蒙Next中应用的进程和线程如何理解?
HarmonyOS鸿蒙Next中应用的进程和线程如何理解? 鸿蒙应用的进程和线程如何理解?
一、结论

-
进程的定义: 进程是系统进行资源分配的基本单位,是操作系统结构的基础。
在鸿蒙系统中,一个应用下会有三类进程: (1) 主进程, (2) ExtensionAbility进程,同一种类型的ExtensionAbility会放在一个进程里。例如FromExtensionAbility,创建了两个,也会在同一个进程里。【ExtensionAbility详情参见官方链接:ExtensionAbility组件】 (3) WebView渲染进程,用于网页容器渲染的进程。【这种设计提升了鸿蒙系统中arkWeb的网页容器渲染能力】
-
线程的定义: 线程是操作系统进行运算调度的基本单位,是进程中的执行流,共享进程的资源。
鸿蒙系统中,以主进程举例,会有三种类型的线程: (1)主线程 (2)TaskPool Worker线程 (3)Worker线程 后两者用于创建多线程,TaskPool Worker主要用于处理轻量级的耗时任务。Worker用于偏重的耗时任务。
-
二、代码实现和详细解释
-
进程的创建:
-

-
进程的创建: 如上图所示,三方应用可以创建XXExtensionAbility的形式,增加应用内的进程。但是Webview渲染进程和主进程的是不能创建增加。
-
跨进程通信: 鸿蒙系统目前提供了两种方式实现跨进程通信,公共事件和Emitter。这两个方案外,startAbility也可传递一些信息。
-
公共事件主要是监听系统的事件,分为系统公共事件和自定义事件。三方应用主要通过自定义事件来通信。
import { commonEventManager } from '@kit.BasicServicesKit';
import { BusinessError } from '@kit.BasicServicesKit';
// 定义订阅者,用于保存创建成功的订阅者对象,后续使用其完成订阅及退订的动作
let subscriber: commonEventManager.CommonEventSubscriber;
// 订阅者信息
let subscribeInfo: commonEventManager.CommonEventSubscribeInfo = {
events: ["event"]
};
// 创建订阅者回调
function createCB(err: BusinessError, commonEventSubscriber: commonEventManager.CommonEventSubscriber) {
if (err != null) {
console.error(`Failed to create subscriber. Code is ${err.code}, message is ${err.message}`);
} else {
console.info(`Succeeded in creating subscriber`);
subscriber = commonEventSubscriber;
}
}
// 创建订阅者
commonEventManager.createSubscriber(subscribeInfo, createCB);
Emitter的使用类似于EventHub,只不过在这个基础上,多了传递包裹的封装,添加了优先级和序号。也新增了once,监听一次的接口而已。
@Sendable
class Sample {
constructor() {
this.count = 100;
}
printCount() {
console.info('Print count : ' + this.count);
}
count: number;
}
let callback = (eventData: emitter.GenericEventData<Sample>): void => {
let storage: Sample = eventData.data!;
storage.printCount();
}
// 收到eventId为"eventId"的事件后执行回调函数
emitter.on("eventId", callback);
线程的创建:
1.线程的创建和线程间通信: 如上所说,可以使用TaskPool Worker 和 Worker创建线程。并且配套会有双向通信的接口。 需要注意的是前者有性能要求,太过于耗时的操作,例如超过三分钟,就会无条件失败,这种耗时任务就要使用后者Worker来实现。不过后者又因为消耗系统资源,一个应用只能创建八个。
TaskPool Worker:
@Concurrent
function printArgs(args: number): number {
console.info("printArgs: " + args);
return args;
}
taskpool.execute(printArgs, 100).then((value: Object) => { // 100: test number
console.info("taskpool result: " + value);
});
Worker:
// Worker.ets
import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
// 创建worker线程中与宿主线程通信的对象
const workerPort = worker.workerPort
// worker线程接收宿主线程信息
workerPort.onmessage = (e: MessageEvents): void => {
// data:宿主线程发送的信息
let data: number = e.data;
// 往收到的buffer里写入数据
const view = new Int8Array(data).fill(3);
// worker线程向宿主线程发送信息
workerPort.postMessage(view);
}
// worker线程发生error的回调
workerPort.onerror = (err: ErrorEvent) => {
console.log("worker.ets onerror" + err.message);
}
// Index.ets
import { worker, MessageEvents, ErrorEvent } from '@kit.ArkTS';
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
// 宿主线程中创建Worker对象
const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
// 宿主线程向worker线程传递信息
const buffer = new ArrayBuffer(8);
workerInstance.postMessage(buffer, [buffer]);
// 宿主线程接收worker线程信息
workerInstance.onmessage = (e: MessageEvents): void => {
// data:worker线程发送的信息
let data: number = e.data;
console.info("main thread data is " + data);
// 销毁Worker对象
workerInstance.terminate();
}
// 在调用terminate后,执行onexit
workerInstance.onexit = (code) => {
console.log("main thread terminate");
}
workerInstance.onerror = (err: ErrorEvent) => {
console.log("main error message " + err.message);
}
})
}
.width('100%')
.height('100%')
}
}
}
2.线程内通信: EventHub,GlobalThis,单例,AppStorage。都可实现线程内UI界面,UIAbility和业务类之间的通信。
更多关于HarmonyOS鸿蒙Next中应用的进程和线程如何理解?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,应用进程是资源分配的基本单位,每个应用默认运行在独立进程中,确保安全隔离。线程是进程内的执行单元,用于并发任务处理。鸿蒙采用分布式架构,支持多线程并发,并通过ArkTS语言的高效运行时管理线程生命周期,优化资源调度。进程间通信通过RPC机制实现,线程间则依靠共享内存和消息队列进行数据交换。系统自动管理进程和线程的创建与销毁,开发者只需关注业务逻辑实现。
在HarmonyOS Next中,进程和线程是应用运行的基础模型,其设计与传统操作系统有显著区别,核心在于为不同设备提供统一、高效的开发体验。
1. 进程模型 HarmonyOS Next应用默认运行在独立的“应用沙箱”中,这可以理解为一个受严格保护的进程环境。每个应用进程彼此隔离,确保安全性和稳定性。其重要特性包括:
- 单进程原则:默认情况下,一个UIAbility(应用组件)及其关联的UI和业务逻辑运行在一个主进程中。这是推荐的标准模式。
- 多进程能力:对于需要更高性能或隔离性的复杂应用(如大型游戏、音视频应用),开发者可以配置特定的UIAbility运行在独立的子进程中。这需要显式声明,并非默认行为。
- 进程生命周期:进程由系统统一管理,根据应用组件的状态和系统资源情况动态创建和销毁。开发者应关注UIAbility等组件的生命周期,而非直接管理进程。
2. 线程模型 HarmonyOS Next提供了清晰的线程分层,开发者应使用高级API而非直接操作原生线程。
-
主线程(UI线程):
- 负责运行UIAbility的生命周期回调、事件处理和UI更新。
- 绝对禁止在主线程执行耗时操作(如网络请求、大量计算、文件IO),否则会导致界面卡顿甚至应用无响应(ANR)。
-
任务(Task)与任务池(TaskPool):
- 这是推荐且主要的异步并发开发方式。
TaskPool提供轻量级的并发任务管理机制,适合执行离散的、无依赖的异步任务(如图像解码、数据计算)。 - 系统会高效管理底层线程池,开发者只需关注任务本身。它比直接创建线程开销更小,能避免线程数量爆炸。
- 这是推荐且主要的异步并发开发方式。
-
Worker线程:
- 用于执行长时间运行的、有状态的异步任务,或需要维护独立上下文的操作(如数据库持续监听、音视频流处理)。
- Worker与主线程通过消息进行通信,内存隔离,适合更重型的后台作业。
3. 核心对比与选择建议
- TaskPool vs Worker:
- TaskPool:任务独立、无状态、执行时间短。首选方案。
- Worker:任务持续、有状态、需要独立上下文或与主线程频繁通信。
- 与传统的区别:HarmonyOS Next通过
TaskPool/Worker抽象,引导开发者远离直接管理Thread,从而更好地利用系统调度能力,提升能效和性能。
总结: 理解HarmonyOS Next的进程线程模型,关键在于掌握 “单进程为主,按需配置多进程” 的进程原则,以及 “主线程保流畅,异步并发用TaskPool,长任务用Worker” 的线程开发范式。遵循这套模型,可以构建出高性能、高响应且功耗可控的应用。

