HarmonyOS鸿蒙Next中线程间通信的场景及实现案例
HarmonyOS鸿蒙Next中线程间通信的场景及实现案例 1、通信场景
a、同语言线程间通信(ArkTS内)
场景描述:
ArkTS线程指的是包含ArkTS运行环境的线程,包括主线程、Taskpool线程、Worker线程。它们之间可以通过不同的接口进行通信。
常见业务场景 | 具体业务描述 |
---|---|
宿主JS线程<——>Taskpool线程 | 通过使用Taskpool,分发任务到子线程。Taskpool子任务与其宿主线程之间需要通信的场景。 |
宿主JS线程<——>Worker线程 | 通过使用Worker,启动子线程,执行任务。Worker子线程与其宿主线程之间需要通信的场景。 |
任意JS线程<——>任意JS线程 | 除了上述两种线程外,其他任意两个JS线程需要通信的场景。 |
实现方案:
常见业务场景 | 具体业务描述 | 通信优先级 |
---|---|---|
宿主JS线程<——>Taskpool线程 | 参数传递后分发任务;过程中不支持正向通信 | 支持 |
Taskpool线程——>宿主JS线程 | 结果返回;sendData触发宿主线程异步回调。底层为uv_async_send实现 | 支持 |
宿主JS线程——>Worker线程 | 采用postMessage&onmessage异步通信 | 支持 |
Worker线程——>宿主JS线程 | 异步方式:采用postMessage&onmessage异步通信 同步方式:支持Worker线程同步调用宿主线程注册的方法 |
支持 |
任意JS线程<——>任意JS线程 | 使用@ohos.emitter实现双向异步通信 | 支持 |
b、跨语言线程间通信(C++与ArkTS)
场景描述:
ArkTS线程指的是包含ArkTS运行环境的线程,包括主线程、Taskpool线程和Worker线程。
由于HarmonyOS支持通过N-API开发C++业务,用户可以在C++层创建线程,因此C++线程存在于ArkTS线程通信的场景。
常见业务场景 | 具体业务描述 |
---|---|
ArkTS线程(ArkTS)<——>pthread线程 | ArkTS线程的ArkTS部分与pthread线程的通信场景 |
ArkTS线程(C++)<——>pthread线程 | ArkTS线程的C++部分与pthread线程的通信场景 |
pthread线程<——>pthread线程 | C++线程间的通信场景 |
实现方案:
跨线程交互场景 | 通信方式 | 通信优先级 |
---|---|---|
ArkTS线程(ArkTS)——>pthread线程 | 不支持,需要转到C++ | 不涉及 |
pthread线程——>ArkTS线程(ArkTS) | 采用napi_threadsafe_function通信 | 支持 |
pthread线程——>ArkTS线程(C++) | 开发者自定义行为 | 开发者自定义行为 |
ArkTS线程(C++)——>pthread线程 | 开发者自定义行为 | 开发者自定义行为 |
pthread线程<——>pthread线程 | 开发者自定义行为 | 开发者自定义行为 |
c、线程间模块共享
描述:
某些进程唯一的ArkTS实例初始化流程复杂,整体耗时长,放在主线程中对其进行初始化或造成应用启动耗时久和阻塞主线程的执行。将这些实例的初始化流程放在ArkTS子线程中进行初始化,初始化完成后主线程可以直接使用该实例。
实现方案:
- 步骤一:采用C++单例模式封装,上层封装JS壳,子线程进行初始化。
- 步骤二:初始化完成通知主线程,主线程导入使用该单例对象。
2、通信方案介绍
Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。
3、案例及DEMO
1、Taskpool参考:https://developer.huawei.com/consumer/cn/forum/topic/0203162147060555133?fid=0109140870620153026
2、Worker参考:https://developer.huawei.com/consumer/cn/forum/topic/0212162226831765933?fid=0109140870620153026
3、基于Emitter的实现案例
import { emitter } from '@kit.BasicServicesKit';
import { promptAction } from '@kit.ArkUI';
import { taskpool } from '@kit.ArkTS';
@Concurrent
function calcDe() {
const event: emitter.InnerEvent = {
eventId: 1,
priority: emitter.EventPriority.LOW
};
const eventData: emitter.EventData = {
data: {
content: '这是taskpool线程数据',
id: 1,
isEmpty: false
}
};
emitter.emit(event, eventData);
}
function taskpoolExecTool() {
taskpool.execute(new taskpool.Task(calcDe))
}
@Entry
@Component
struct Index {
registerEvent() {
const event: emitter.InnerEvent = {
eventId: 1,
};
const callback = (eventData: emitter.EventData): void => {
promptAction.showToast({
message: JSON.stringify(eventData)
});
}
emitter.on(event, callback);
promptAction.showToast({
message: '主线程订阅事件成功!'
})
}
aboutToAppear(): void {
this.registerEvent();
}
build() {
RelativeContainer() {
Button('触发Taskpool线程发送消息')
.id('HelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
}).onClick(() => {
taskpoolExecTool()
})
}
.height('100%')
.width('100%')
}
}
更多关于HarmonyOS鸿蒙Next中线程间通信的场景及实现案例的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,线程间通信(IPC)主要通过以下场景和方式实现:
-
事件通信:通过
Event
机制实现线程间的事件传递。Event
是一种轻量级的通信方式,适用于线程间简单的事件通知。开发者可以使用Event
类来创建事件,并通过EventRunner
来分发和处理事件。 -
消息通信:通过
Message
和MessageQueue
实现线程间的消息传递。Message
可以携带数据,MessageQueue
用于存储和分发消息。开发者可以使用Handler
来发送和处理消息,适用于需要传递复杂数据的场景。 -
共享内存:通过
SharedMemory
实现线程间的数据共享。SharedMemory
允许多个线程访问同一块内存区域,适用于需要高效传递大量数据的场景。开发者可以使用SharedMemory
类来创建和管理共享内存区域。 -
远程调用:通过
RemoteObject
和RemoteProxy
实现跨进程的远程调用。RemoteObject
用于定义远程对象,RemoteProxy
用于代理远程对象的调用。适用于需要跨进程通信的场景。 -
信号量:通过
Semaphore
实现线程间的同步。Semaphore
用于控制多个线程对共享资源的访问,适用于需要线程同步的场景。开发者可以使用Semaphore
类来创建和管理信号量。 -
条件变量:通过
Condition
实现线程间的条件等待和通知。Condition
用于线程间的条件同步,适用于需要等待特定条件满足的场景。开发者可以使用Condition
类来创建和管理条件变量。
这些通信方式在HarmonyOS鸿蒙Next中提供了灵活的线程间通信机制,开发者可以根据具体需求选择合适的通信方式。
更多关于HarmonyOS鸿蒙Next中线程间通信的场景及实现案例的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,线程间通信主要通过事件机制、消息队列和共享内存实现。常见场景包括:
事件机制
适用于轻量级通信,如UI线程与后台线程的交互。通过EventRunner
和EventHandler
实现,UI线程发送事件,后台线程处理事件。
消息队列
适用于复杂任务的分发与处理。通过MessageQueue
和Message
实现,生产者线程将消息放入队列,消费者线程从队列中取出并处理。
共享内存
适用于大数据量的高效传输。通过SharedMemory
实现,多个线程可以访问同一块内存区域,实现数据共享。
案例:UI线程通过事件机制通知后台线程更新数据,后台线程处理完成后通过消息队列将结果返回给UI线程进行显示。