news 2026/4/16 16:36:10

【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/4/16 11:13:41

MATLAB实现流形正则化主题模型LapPLSI算法详解

在文本挖掘和主题建模领域,传统的pLSA(Probabilistic Latent Semantic Analysis)和LDA模型假设文档独立同分布,但现实中文档往往存在内在关联(如引用关系、相似内容或社交网络)。为了利用这些文档间的流形结构,研究者提出了Laplacian Probabilistic Latent Semantic Ind…

作者头像 李华
网站建设 2026/4/16 14:50:03

操作mysql常用python脚本,强到爆炸

1.导出数据库指定表的所有字段(含有字段注释)和数据导出结果如下#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ MySQL数据导出工具 - 修复元组索引问题 """import pandas as pd import pymysql import openpyxl from openpyxl.utils impo…

作者头像 李华
网站建设 2026/4/16 14:50:17

前后端分离学科竞赛管理系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程

摘要 随着信息技术的快速发展&#xff0c;学科竞赛管理系统的信息化和智能化需求日益增长。传统的学科竞赛管理模式依赖人工操作&#xff0c;效率低下且容易出错&#xff0c;难以满足大规模竞赛活动的需求。为了解决这一问题&#xff0c;设计并实现一个基于前后端分离架构的学科…

作者头像 李华
网站建设 2026/4/16 14:49:55

DSP算法学习

都是以QPSK为例针对不同的qam信号&#xff0c;一些算法可能不同&#xff0c;还需读者再去学习从IQ时延对准-IQ不平衡-粗色散补偿-自适应均衡解复用-频偏估计与补偿-载波相位恢复

作者头像 李华
网站建设 2026/4/16 14:50:21

ai-agent 一个强大的辅助工具

随着ai的大热&#xff0c;如何更好的利用ai&#xff0c;而不单单作为知识的查询。如果它能帮我们设计测试用例&#xff0c;执行用例&#xff0c;并给出结果&#xff0c;甚至可以帮我们开发&#xff0c;是不是一个梦中情tool。 这不单单是幻想&#xff0c;目前不少大厂已经实现&…

作者头像 李华