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

HarmonyOS 5.0应用开发——多线程Worker和@Sendable的使用方法

【高心星出品】

文章目录

      • 多线程Worker和@Sendable的使用方法
        • 开发步骤
        • 运行结果

多线程Worker和@Sendable的使用方法

Worker在HarmonyOS中提供了一种多线程的实现方式,它允许开发者在后台线程中执行长耗时任务,从而避免阻塞主线程并提高应用的响应性。

@Sendable 注解主要用于标记那些需要在多线程环境中共享的数据对象或函数。被 @Sendable 标记的对象或函数可以在不同的线程之间高效地传输数据,这主要得益于 ArkTS 的序列化和反序列化机制。

开发步骤

【案例需求】 接下来要实现一个案例,创建两个子线程,一个子线程负责数据求和,一个子线程负责数据相减,UI线程提供共享数据给这两个子线程,子线程运行结果返回给UI线程。

  • 创建两个worker。

    在ets/下创建一个workers目录,在该目录下创建worker。这两个worker负责接受UI线程传过来的数据,并且负责子线程运行实体,并将结果发送给UI线程。

在这里插入图片描述

在这里插入图片描述

  • addworker的代码
import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import { Temp } from '../pages/Index';const workerPort: ThreadWorkerGlobalScope = worker.workerPort;/*** Defines the event handler to be called when the worker thread receives a message sent by the host thread.* The event handler is executed in the worker thread.** @param event message data*/
// 线程运行实体
function add(temp:Temp){let a=temp.alet b=temp.btemp.a+=5return a+b
}
// 子线程接受UI线程信息并处理
workerPort.onmessage = async (event: MessageEvents) => {if(event){// 模拟线程睡眠2sawait new Promise((resolve:(v:number)=>void)=>{setTimeout(()=>{resolve(10)},2000)})// 解析获取ui线程发送的数据let t=event.data as Temp// 子线程向UI线程发送消息workerPort.postMessage(add(t))}
};/*** Defines the event handler to be called when the worker receives a message that cannot be deserialized.* The event handler is executed in the worker thread.** @param event message data*/
workerPort.onmessageerror = (event: MessageEvents) => {
};/*** Defines the event handler to be called when an exception occurs during worker execution.* The event handler is executed in the worker thread.** @param event error message*/
workerPort.onerror = (event: ErrorEvent) => {
};
  • jianworker的代码
import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import { Temp } from '../pages/Index';const workerPort: ThreadWorkerGlobalScope = worker.workerPort;/*** Defines the event handler to be called when the worker thread receives a message sent by the host thread.* The event handler is executed in the worker thread.** @param event message data*/
// 线程运行实体
function jian(t:Temp){let a=t.alet b=t.bt.a-=5return Math.abs(a-b)
}
// 子线程接受UI线程的信息 并运行
workerPort.onmessage = async (event: MessageEvents) => {if(event){// 模拟线程睡眠2sawait new Promise((resolve:(v:string)=>void)=>{setTimeout(()=>{resolve('a')},2000)})let t=event.data as Temp// 向UI线程发送消息workerPort.postMessage(jian(t))}
};/*** Defines the event handler to be called when the worker receives a message that cannot be deserialized.* The event handler is executed in the worker thread.** @param event message data*/
workerPort.onmessageerror = (event: MessageEvents) => {
};/*** Defines the event handler to be called when an exception occurs during worker execution.* The event handler is executed in the worker thread.** @param event error message*/
workerPort.onerror = (event: ErrorEvent) => {
};
  • Index.ets代码
import { MessageEvents, worker } from "@kit.ArkTS";@Sendable
export class Temp {a: numberb: numberconstructor(a: number, b: number) {this.a = a;this.b = b;}
}
@Entry
@Component
struct Index {@State message: string = 'Hello World';// UI线程和其他两个子线程共享的数据private temp = new Temp(10, 20)//创建了两个线程private addthread = new worker.ThreadWorker('entry/ets/workers/addworker.ets')private jianthread = new worker.ThreadWorker('entry/ets/workers/jianworker.ets')aboutToAppear(): void {// UI线程中接受两个子线程发送的信息this.addthread.onmessage = (event: MessageEvents) => {console.log('gxxt add ', event.data as number)console.log('gxxt 当前的temp值: ',JSON.stringify(this.temp))}this.jianthread.onmessage = (event: MessageEvents) => {console.log('gxxt jian ', event.data as number)console.log('gxxt 当前的temp值: ',JSON.stringify(this.temp))}}build() {Column({ space: 20 }) {Button('加线程').width('60%').onClick(() => {this.addthread.postMessageWithSharedSendable(this.temp)})Button('减线程').width('60%').onClick(() => {this.jianthread.postMessageWithSharedSendable(this.temp)})}.height('100%').width('100%').justifyContent(FlexAlign.Center)}
}

项目通过点击两个按钮启动两个线程,并将共享数据temp发送给两个子线程,两个子线程分别执行相加和相减,同时还更新共享数据的原始值,通过观察运算结果和共享数据的变化,我们能掌握worker的开发方式。

运行结果
02-28 09:10:59.798   3292-3292     A03d00/JSAPP     com.gxx.workdemo      I     gxxt add运算结果:  30
02-28 09:10:59.799   3292-3292     A03d00/JSAPP     com.gxx.workdemo      I     gxxt 当前的temp值:  {"a":15,"b":20}
02-28 09:11:04.877   3292-3292     A03d00/JSAPP     com.gxx.workdemo      I     gxxt jian运算结果  5
02-28 09:11:04.877   3292-3292     A03d00/JSAPP     com.gxx.workdemo      I     gxxt 当前的temp值:  {"a":10,"b":20}

刚一开始进行运算的时候add线程面对的a为10,b为20,计算结果为30,add线程同时a=a+5操作,所以此时UI线程得到的a为15;然后jian线程运行结果为|15-20|,jian线程同时a=a-5,所以此时UI线程得到的a为10.

相关文章:

HarmonyOS 5.0应用开发——多线程Worker和@Sendable的使用方法

【高心星出品】 文章目录 多线程Worker和Sendable的使用方法开发步骤运行结果 多线程Worker和Sendable的使用方法 Worker在HarmonyOS中提供了一种多线程的实现方式,它允许开发者在后台线程中执行长耗时任务,从而避免阻塞主线程并提高应用的响应性。 S…...

华为OD-2024年E卷-分批萨[100分]

文章目录 题目描述输入描述输出描述用例1解题思路Python3源码 题目描述 吃货"和"馋嘴"两人到披萨店点了一份铁盘(圆形)披萨,并嘱咐店员将披萨按放射状切成大小相同的偶数个小块。但是粗心的服务员将披萨切成了每块大小都完全不…...

SSH监控

创建/etc/ssh/sshrc文件 写入以命令 echo " 系统状态 " uptime free -h 每次登录会显示 如果在sshrc文件加入以下脚本每次登录就是执行这个脚本 # cat /etc/ssh/sshrc echo " 系统状态 " uptime free -h /usr/local/bin/monit.sh以…...

leetcode日记(74)扰乱字符串

很有难度的一题,一开始真的绕了很多思维上的弯路。 最开始的想法是递归,看到题目的时候想到动态规划但是完全没有思路应该怎么用,结果确实是递归动态规划。 最开始的想法是构建树,每一层包含这一步划分的方法(实际会…...

RV1126的OSD模块和SDL_TTF结合输出H264文件

目录 一.RV1126多线程处理输出OSD字符叠加图层的流程 1.1. VI模块的初始化 1.2. 初始化VENC模块: 1.3. 初始化RGN模块: 1.4. 绑定VI模块和VENC模块,伪代码如下 1.5. 创建多线程进行OSD字库的叠加: 1.6. 获取每一帧处理过后的…...

GEE:计算长时间序列NPP与NDVI之间的相关系数

GEE中内置了计算相关系数的函数,可以分析两个变量之间的相关性,比如要分析两个波段之间的相关性,主要用到ee.Reducer.pearsonsCorrelation()函数。 ee.Reducer.pearsonsCorrelation() 内容:创建一个双输入归约器,用于…...

水仙花数(华为OD)

题目描述 所谓水仙花数,是指一个n位的正整数,其各位数字的n次方和等于该数本身。 例如153是水仙花数,153是一个3位数,并且153 13 53 33。 输入描述 第一行输入一个整数n,表示一个n位的正整数。n在3到7之间&#x…...

【对话状态跟踪】关心整个对话过程用户完整意图变化

对话状态管理器 核心逻辑是解决键冲突和验证范围有效性, 但需依赖外部输入的正确性。在实际应用中, 可能需要结合用户提示或自动修正逻辑以提高鲁棒性。 NLU 槽 值 对儿 NLU的目的是把自然语言解析成结构化语义。结构化语义有多种表示方式&#xff0c…...

【分享】网间数据摆渡系统,如何打破传输瓶颈,实现安全流转?

在数字化浪潮中,企业对数据安全愈发重视,网络隔离成为保护核心数据的重要手段。内外网隔离、办公网与研发网隔离等措施,虽为数据筑牢了防线,却也给数据传输带来了诸多难题。传统的数据传输方式在安全性、效率、管理等方面暴露出明…...

TikTok创作者市场关闭!全新平台TikTok One将带来哪些改变?

TikTok创作者市场关闭,全新平台TikTok One上线,创作者和品牌将迎来哪些新机遇? 近日,TikTok宣布关闭其原有的创作者市场(TikTok Creator Marketplace),并推出全新平台TikTok One。这一消息在社…...

LeetCode hot 100—矩阵置零

题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1…...

部署Windows Server自带“工作文件夹”实现企业网盘功能完整步骤

前文已经讲解过Windows Server自带的“工作文件夹”功能,现以Windows Server 2025为例介绍部署工作文件夹的完整步骤: 为了确保您能够顺利部署和充分利用工作文件夹的功能,我将按照以下步骤进行讲解。 请注意,在域环境中部署工作…...

植物大战僵尸杂交版v3.3最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.3版本!!!,有b站账户的记得要给作者三连关注一下呀! 不多废话下载链接放上: 夸克网盘链接::https://pan.quark.cn/s/6f2a…...

非关系型数据库和关系型数据库的区别

非关系型数据库(NoSQL)和关系型数据库(SQL)的主要区别体现在以下几个方面: 数据模型: 关系型数据库(SQL):数据以表格形式存储,数据行和列组成,每个…...

CPU负载高告警问题的定位与优化建议

#作者:猎人 文章目录 背景一.问题排查1.1 找到相应的容器1.2 找到对应的deployment1.3 查看pod日志1.4 查看nginx配置文件1.5 查看deployment的yaml文件 二.优化建议 背景 Docker 版本:19.03.14 Operating System: Red Hat Ent…...

2月28日,三极管测量,水利-51单片机

众所周知,三极管(BJT)有三个管脚,基极(B)、集电极(C)、发射极(E),在实际应用中,不可避免地会遇到引脚辨别的问题。接下来就讲下三极管…...

批量提取 Word 文档中的图片

在 Word 文档中,我们可以插入图片、文本、链接等各种各样的资源。在某些场景下我们需要提取这些信息,比如我们需要提取 Word 文档中的图片,将每一个 Word 文档中的图片都提取出来放到一个单独的文件夹中,那么我们应该怎么做呢&…...

C#—Settings配置详解

C#—Settings配置详解 在C#项目中,全局配置通常指的是应用程序的设置(settings),这些设置可以跨多个类或组件使用,并且通常用于存储应用程序的配置信息,如数据库连接字符串、用户偏好设置等。 Settings配置…...

UI自动化框架介绍

selenium Pytest Allure 优势 1.1 更高效的自动化测试 Selenium 提供了强大的浏览器自动化能力,可以模拟用户与网页的交互。它能够在不同浏览器上运行测试,确保 Web 应用程序在多种环境下的兼容性。Pytest 是一个非常灵活、简洁的 Python 测试框架&a…...

【工具推荐】在线提取PDF、文档、图片、论文中的公式

网址1:https://simpletex.cn/ai/latex_ocr 网址2: https://www.latexlive.com/home 推荐理由:无需下载,在线使用,直接 截图 CTRLV 效果更佳。...

告别PPT超时焦虑:PPTTimer让演讲时间管理变得如此简单

告别PPT超时焦虑:PPTTimer让演讲时间管理变得如此简单 【免费下载链接】ppttimer 一个简易的 PPT 计时器 项目地址: https://gitcode.com/gh_mirrors/pp/ppttimer 还在为PPT演示超时而烦恼吗?每次演讲都像和时间赛跑,担心讲得太快或太…...

Multisim 13.0 保姆级教程:手把手教你搭建丙类谐振功放,从波形观察到参数分析

Multisim 13.0 丙类谐振功放仿真全流程实战指南 在电子工程领域,高频电路设计一直是让初学者望而生畏的课题。传统实验室受限于设备成本和操作风险,很难为学生提供充分的实践机会。而Multisim作为电路仿真领域的标杆工具,为学习者打开了一扇安…...

创业团队如何利用Taotoken统一技术栈并降低AI接入门槛

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 创业团队如何利用Taotoken统一技术栈并降低AI接入门槛 对于资源有限的创业团队而言,在产品中集成人工智能能力是提升竞…...

CANN 模型转换与适配:从 PyTorch 到 Ascend OM 的完整指南

模型转换是昇腾落地的第一道坎。不管你用 PyTorch、TensorFlow 还是 MindSpore,最终都要变成 Ascend 的 .om 模型才能在 NPU 上跑。 这篇文章讲清楚:模型转换的完整流程、常见问题和优化技巧。 为什么需要模型转换? 昇腾 NPU 不能直接运行 Py…...

Wordpress网站使用siteground security optimizer 及 translatepress多语言插件的翻译问题

问题:发现有的页面翻译出错,如下图:经排查,原因是 SiteGround 主机安全插件中的“锁定并保护系统文件夹”功能,阻止了 TranslatePress 插件的 trp-ajax.php 文件正常执行。解决方法:将 trp-ajax.php 加入白…...

【深度解析】Antigravity 2.0:从 AI IDE 到 Agent 编排层,Google 开发者工具栈的技术转向

摘要 Google Antigravity 2.0 不再只是一个 AI IDE,而是围绕桌面端、CLI、SDK 与统一 Agent Harness 构建的新一代智能开发工具栈。本文从架构、模型能力、开发流程与工程落地角度解析其技术价值,并给出可复用的 AI Agent API 调用示例。背景介绍&#x…...

3分钟学会:用WinDiskWriter轻松为老旧电脑安装Windows 11系统

3分钟学会:用WinDiskWriter轻松为老旧电脑安装Windows 11系统 【免费下载链接】windiskwriter 🖥 Windows Bootable USB creator for macOS. 🛠 Patches Windows 11 to bypass TPM and Secure Boot requirements. 👾 UEFI & L…...

从零到一:基于YOLOv8的AI自瞄终极指南

从零到一:基于YOLOv8的AI自瞄终极指南 【免费下载链接】yolov8_aimbot Aim-bot based on AI for all FPS games 项目地址: https://gitcode.com/gh_mirrors/yo/yolov8_aimbot 想象一下,你正在玩最喜欢的FPS游戏,敌人从掩体后一闪而过&…...

ElevenLabs越南文TTS落地全链路:从API密钥配置、SSML控制到本地化韵律校准(含实测MOS评分对比)

更多请点击: https://codechina.net 第一章:ElevenLabs越南文TTS落地全链路概览 ElevenLabs 作为当前高保真语音合成领域的领先平台,其对越南语(vi-VN)的支持已进入生产就绪阶段。尽管官方文档未单独设立越南语专区&a…...

从原理图到PCB:STM32最小系统外围电路布局布线实战避坑指南

从原理图到PCB:STM32最小系统外围电路布局布线实战避坑指南 在嵌入式硬件开发中,设计一个可靠的STM32最小系统PCB远比绘制原理图更具挑战性。许多开发者能够正确连接原理图符号,却在将设计转化为实际电路板时遭遇各种问题——从莫名其妙的复位…...