news 2026/7/13 20:04:56

【HarmonyOS NEXT】多线程并发-taskpool

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【HarmonyOS NEXT】多线程并发-taskpool

一、背景

在鸿蒙开发中提供了两种多线程并发方案,分别是TaskPool与Worker,此篇文章主要总结下TaskPool

二、TaskPool概念

1、TaskPool是为应用提供多线程运行环境,旨在降低资源消耗并提升系统性能

2、开发者无需关心线程的生命周期,由系统统一管理线程的创建、调度和销毁

三、怎么用

使用TaskPool流程:定义任务 → 提交任务 → 处理结果 → 取消任务(可选)

步骤一:定义耗时任务(必须用 @Concurrent 标记)

所有提交到 TaskPool 的耗时函数,必须通过@Concurrent装饰器标记——这是鸿蒙的强制要求,用于告知系统“该函数是耗时任务,需在后台线程执行”。

注意:该函数需满足「无状态、参数可序列化」,不能直接操作 UI(如修改 @State 变量、调用 UI 组件方法)。

@Concurrent function computeTask(a: number, b: number): number { let start = Date.now(); while (Date.now() - start < 2000) { } // 阻塞2秒(后台线程,不影响UI) return a + b; }

步骤二、提交任务+处理结果

创建 Task 实例,将函数和参数包装起来;提交到任务池执行,并等待 Promise 返回的结果

export class taskpoolUtils { private static instance: taskpoolUtils | undefined; public static getInstance(): taskpoolUtils { if (!taskpoolUtils.instance) { taskpoolUtils.instance = new taskpoolUtils(); } return taskpoolUtils.instance; } async runConcurrentTask() { try { // 1. 同步创建Task实例 const task: taskpool.Task = new taskpool.Task(computeTask, 10, 20); // 2. 提交任务到后台线程 const result = await taskpool.execute(task); console.log('lucy== 计算结果result', result); // 2秒后打印30 } catch (err) { // 捕获任务执行异常 console.error('lucy== 任务执行失败', JSON.stringify(err)); } } }

最终效果执行

import { ScreenUtils } from '../utils/ScreenUtils'; import { taskpoolUtils } from '../utils/taskpoolUtils' @Entry @Component struct Index { private globalNavStack: NavPathStack = new NavPathStack(); //UI状态,验证taskpool不阻塞UI @State uiText: string = '未执行任务'; build() { Column() { Navigation(this.globalNavStack) { // 显示UI状态,验证是否阻塞 Text(this.uiText).fontSize(20).margin(20); Button('跳转到login组件+执行耗时任务') .onClick(() => { // 1. 先更新UI(验证UI线程没被阻塞) this.uiText = '任务执行中...'; // 2. 跳转页面(UI操作) this.globalNavStack.pushPathByName('loginPage', null, false); // 3. 执行taskpool耗时任务 taskpoolUtils.getInstance().runConcurrentTask().then(() => { // 任务完成后更新UI this.uiText = '任务执行完成'; }); // 4. 验证:任务执行中,UI仍能响应(立即打印,不会等2秒) console.log('lucy== UI线程未阻塞,立即执行'); }) } .height('100%') .width('100%') .padding({ top: ScreenUtils.getInstance().getStatusBarHeight() }) } } }

四、适用场景

  • 短耗时任务:执行时间建议 ≤ 5 秒(如缓存检查、MD5 校验、小型数据计算、接口参数加密);

  • 无状态任务:任务执行不依赖外部状态,多次执行结果一致(如相同参数的 MD5 计算,结果始终相同);

  • 高并发任务:需要同时执行多个独立任务(如批量下载多个小插件的前置检查);

  • 优先级敏感任务:不同任务有优先级差异(如用户主动触发的下载 > 后台自动更新)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/4 0:51:11

n8n 满分漏洞 Ni8mare 可导致服务器遭劫持

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01;编译&#xff1a;代码卫士n8n 中存在一个CVSS满分、被称为 “Ni8mare” 的严重漏洞CVE-2026-21858&#xff0c;可导致未认证攻击者控制本地部署的工作流自动化平台n8n 实例。网络安全公司 Cyera 表示&#xff0c;目前…

作者头像 李华
网站建设 2026/6/29 6:47:39

上班是一场冷静的交易

将上班视作一场冷静的交易&#xff0c;这并非 cynicism&#xff0c;而是一种珍贵的清醒。它像一副坚固的甲胄&#xff0c;保护我们在职业的疆场上不被无谓的情绪流矢所伤&#xff0c;不被暧昧的期望绑架。我们付出标定好的时间、技能与专注&#xff0c;换取等值的报酬、经验与履…

作者头像 李华
网站建设 2026/7/12 15:07:29

解决Unity中按钮点击索引问题

在使用Unity开发游戏或应用时,经常会遇到需要为多个按钮动态添加点击事件并传递索引参数的情况。然而,这种操作在C#中可能会导致一些意想不到的问题。本文将通过一个实际例子,解释这些问题及其解决方案。 问题描述 假设我们有一个ScrollView组件,其内容包含多个Button对象…

作者头像 李华
网站建设 2026/7/1 6:18:23

python 中 try / except 详解和各类异常介绍

目录 1&#xff09;最基本形态&#xff1a;try except 运行会输出什么&#xff1f; 2&#xff09;捕获“特定异常”&#xff1a;更推荐 3&#xff09;拿到异常对象&#xff1a;看错误信息 4&#xff09;多个 except&#xff1a;按顺序匹配 5&#xff09;except 可以一次…

作者头像 李华
网站建设 2026/6/29 19:04:28

驾驶认知的本质:人类模式 vs 端到端自动驾驶

在讨论自动驾驶系统时&#xff0c;一个常见的误解是把“开车能力”等同于“驾驶智能”。事实上&#xff0c;人类驾驶与端到端自动驾驶之间的核心差异&#xff0c;并不在于动作精度或感知能力&#xff0c;而在于认知结构与任务管理模式。一、人类驾驶&#xff1a;动态任务管理的…

作者头像 李华