HarmonyOS鸿蒙Next中实现多线程并发功能示例代码
HarmonyOS鸿蒙Next中实现多线程并发功能示例代码
介绍
TaskPool和Worker均支持多线程并发能力。
- TaskPool的工作线程会绑定系统的调度优先级,并且支持负载均衡(自动扩缩容);
- Worker需要开发者自行创建,存在创建耗时以及不支持设置调度优先级;
- 性能方面使用TaskPool会优于Worker,因此大多数场景推荐使用TaskPool。
本示例分别利用TaskPool和Worker开发多线程并发场景,以此来展示两者的不同之处以及相似之处。
效果预览

使用说明
- 进入应用会看到消息列表,消息实时刷新。
- 点击任一消息进入对话框,点击下载按钮可将文件下载保存到本地。
实现思路
-
aboutToAppear,在组件即将出现时被调用,用于执行初始化、数据准备操作。
-
在每个页面点击下载后,执行以下操作:
- 创建一个taskpool.Task对象task,将downloadFile函数作为任务,使用this.params.name 作为任务名称,指定一个文件的下载链接,并传入this.context作为任务的上下文。
- 为emitter对象注册event事件的监听器,在事件触发时,从eventData中提取progress信息。
- 打印下载进度信息到控制台。
- 当进度达到 100 时,使用 promptAction.showToast 显示一个下载完成的提示,位置在底部 100 像素处。
-
构造messageReceive()函数,调用systemDateTime.getCurrentTime()方法获取当前时间,使用await等待结果并存储在time变量中。将获取到的当前时间打印到控制台。检查time是否是5000的倍数,如果是,则返回一个字符串name-${time},否则返回一个空字符串。
-
为workerPort的onmessage事件添加一个异步处理函数,当接收到消息时会执行以下操作:
- 打印execute worker task到控制台。
- 从e.data.type中获取flag并将其转换为布尔类型,用于控制while循环。
- 当flag为true时,进入while循环。
- 在循环中调用messageReceive函数获取消息,并使用await等待结果。
- 如果receiveMessage不为空,打印消息并使用workerPort.postMessage将消息发送回宿主线程。
更多关于HarmonyOS鸿蒙Next中实现多线程并发功能示例代码的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,多线程并发功能可以通过TaskDispatcher来实现。TaskDispatcher是鸿蒙系统中用于管理和调度任务的核心类。以下是一个简单的示例代码,展示了如何在鸿蒙Next中创建并执行多线程任务:
import taskpool from '@ohos.taskpool';
// 定义一个异步任务函数
async function asyncTask(param: string): Promise<string> {
return new Promise((resolve) => {
setTimeout(() => {
resolve(`Task completed with param: ${param}`);
}, 1000);
});
}
// 使用TaskDispatcher创建并发任务
async function runConcurrentTasks() {
const task1 = taskpool.execute(asyncTask, ['Task1']);
const task2 = taskpool.execute(asyncTask, ['Task2']);
const task3 = taskpool.execute(asyncTask, ['Task3']);
// 等待所有任务完成
const results = await Promise.all([task1, task2, task3]);
console.log(results); // 输出任务结果
}
runConcurrentTasks();
在这个示例中,taskpool.execute用于将异步任务提交到任务池中执行,从而实现并发。Promise.all用于等待所有任务完成并获取结果。
更多关于HarmonyOS鸿蒙Next中实现多线程并发功能示例代码的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,可以使用TaskDispatcher来实现多线程并发。以下是一个简单的示例代码,展示了如何在主线程中创建并执行多个并发任务:
import ohos.app.dispatcher.TaskDispatcher;
import ohos.app.dispatcher.task.TaskPriority;
import ohos.hiviewdfx.HiLog;
import ohos.hiviewdfx.HiLogLabel;
public class MultiThreadExample {
private static final HiLogLabel LABEL = new HiLogLabel(HiLog.LOG_APP, 0, "MultiThreadExample");
public static void main(String[] args) {
// 获取全局并发任务分发器
TaskDispatcher globalDispatcher = TaskDispatcher.getGlobalTaskDispatcher(TaskPriority.DEFAULT);
// 提交并发任务
for (int i = 0; i < 5; i++) {
final int taskId = i;
globalDispatcher.asyncDispatch(() -> {
HiLog.info(LABEL, "Task %d is running on thread: %s", taskId, Thread.currentThread().getName());
});
}
HiLog.info(LABEL, "Main thread continues to run.");
}
}
在这个示例中,我们使用TaskDispatcher来提交多个并发任务,每个任务会在不同的线程中执行。asyncDispatch方法用于异步执行任务,主线程不会阻塞。

