当前位置: 首页 > news >正文

【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 计算,结果始终相同);

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

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

http://www.jsqmd.com/news/217561/

相关文章:

  • 大数据领域数据架构的发展趋势洞察
  • 在 Linux 发行版中安装 Times New Roman 字体
  • n8n 满分漏洞 Ni8mare 可导致服务器遭劫持
  • 【配电网重构】基于混合整数二阶锥配电网重构研究(Matlab代码实现)
  • [特殊字符]_内存管理深度解析:如何避免GC导致的性能陷阱[20260108170807]
  • [特殊字符]_压力测试与性能调优的完整指南[20260108171530]
  • 今天智谱上市,成为全球大模型第一股!
  • 今天智谱上市,成为全球大模型第一股!
  • 小米集团2025千万技术大奖正式颁发,自研芯片玄戒O1斩获最高奖项
  • MATLAB实现流形正则化主题模型LapPLSI算法详解
  • MATLAB实现大规模K-means聚类并保存分区结果到二进制文件
  • 企业级学科竞赛管理管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • MATLAB实现图正则化稀疏编码的系数求解:Feature-Sign Search算法详解
  • 【大模型应用开发】核心问题深度拆解(原理+方案+落地实践)
  • 美国芯片再次靠华人拯救成功,重执芯片牛耳,华人的能力得到证明
  • 开源版 Manus 火爆全网,狂揽 7.5 万 GitHub Star!
  • 企业级墙绘产品展示交易平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • Oracle数据库中的层次查询优化
  • 基于CNN的车牌识别网络
  • 【Git核心操作实战】从初始化到冲突解决与回滚(附完整演示)
  • Spring Boot 钩子全集实战(五):ApplicationContextInitializer详解
  • Teams Webhook 传递长文本的技巧与示例
  • Apache Paimon多模态数据湖实践:从结构化到非结构化的技术演进
  • 利用多进程提升图表模拟程序的性能
  • 基于Java+SpringBoot+SSM儿童医院挂号管理系统(源码+LW+调试文档+讲解等)/儿童医院预约系统/儿童医院就诊管理系统/医院挂号管理系统/儿童医院挂号平台/儿童医院在线挂号
  • 网上租赁系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • 总结了 12 个嵌入式项目
  • 使用aop切面springmvc后抛出异常一直捕捉不到异常(抛出异常UndeclaredThrowableException类)
  • 在Azure中实现跨订阅的AMPLS自动链接策略
  • Java Web Web足球青训俱乐部管理后台系统系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】