# 【鸿蒙开发】多线程之Worker的使用

【鸿蒙开发】多线程之Worker的使用


文章目录

  • 【鸿蒙开发】多线程之Worker的使用
  • 前言
  • 一、Worker的介绍
  • 二、注意事项
  • 三、Worker使用示例
    • 1.新建一个Worker
    • 2.主线程使用Worker
    • 3.子线程Worker的使用
  • 四、效果展示


前言

本文主要介绍了多线程的方法之一,使用Worker开启多线程,介绍了如何使用Worker。之前发布过TaskPool的使用,大家可以点击链接查看。
# 【鸿蒙开发】多线程之TaskPool的使用


一、Worker的介绍

Worker 是用于多线程并行任务处理的,能利用多核优势提效。在程序里,主线程管界面交互、任务调度,Worker 线程专注耗时计算或异步操作,像处理大数据、渲染复杂图形、密集网络请求时,让主线程保持灵敏,快速响应操作。Worker最多支持64个多线程,TaskPool没有这个限制。workder是通过onMessage和postMessage发消息实现主线程和子线程的通信的,TaskPool是通过参数的方式进行通信。

二、注意事项

1、及时关闭 Worker:开发者要清楚,Worker 完成任务后,得手动关闭,如果不关闭,资源会一直被占用,导致系统性能下降,甚至可能内存泄漏。
2、避免主线程卡顿:Worker 在多线程编程里很重要,主要负责处理耗时任务,像大数据处理、频繁网络请求等。它能帮主线程分担压力,让主线程专注用户交互与任务调度,快速响应操作
3、谨慎共享资源:虽然 Worker 线程和主线程能共享部分资源,但开发时不能过度依赖。多个 Worker 线程同时读写同一共享资源,容易混乱,导致数据出错、不一致,尽量给 Worker 配独立资源。

三、Worker使用示例

1.新建一个Worker

在这里插入图片描述

2.主线程使用Worker

Worker是通过onMessage和postMessage进行主线程和子线程通信的

  //worker的使用getWorker() {const work1 = new worker.ThreadWorker("entry/ets/workers/Worker.ets")work1.postMessage(123) //主线程给子线程发消息//主线程接收消息work1.onmessage = (event) => {// event.data-可以拿到子线程发送的消息AlertDialog.show({ message: '收到子线程发的消息' + JSON.stringify(event)})work1.terminate() //worker需要自毁或者再Workers那执行workerPort.close()}}

主线程完整代码:

import { worker } from '@kit.ArkTS';@Entry
@Component
struct Index {aboutToAppear(): void {this.getWorker()}//worker的使用getWorker() {const work1 = new worker.ThreadWorker("entry/ets/workers/Worker.ets")work1.postMessage(123) //主线程给子线程发消息//主线程接收消息work1.onmessage = (event) => {// event.data-可以拿到子线程发送的消息AlertDialog.show({ message: '收到子线程发的消息' + JSON.stringify(event) })work1.terminate() //worker需要自毁或者再Workers那执行workerPort.close()}}build() {RelativeContainer() {}.height('100%').width('100%')}
}

注意事项:本次演示代码路径
在这里插入图片描述
如果代码测试请求数据,注意在modules.json5中开启网络权限
在这里插入图片描述

3.子线程Worker的使用

子线程创建时会生成代码,我们在workerPort.onmessage中处理和主线程的通信即可。

workerPort.onmessage = async (e: MessageEvents) => {// e.data  可以拿到主线程传的消息console.log(' 接收到主线程发来的消息-----> ', e.data)const req = http.createHttp()const res = await req.request('https://xxx/home/banner')//子线程给主线程发消息--将请求结果返回workerPort.postMessage(JSON.stringify(res))// 如果主线程没有关闭worker,主线程可以让worker自焚// workerPort.close() //自毁
}

子线程完整代码:

import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import { http } from '@kit.NetworkKit';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 e message data*/
workerPort.onmessage = async (e: MessageEvents) => {// e.data  可以拿到主线程传的消息console.log(' 接收到主线程发来的消息-----> ', e.data)// AlertDialog.show({ message: '接收到主线程发来的消息:' + e.data, alignment: DialogAlignment.Center })const req = http.createHttp()const res = await req.request('https://xxx/home/banner')//子线程给主线程发消息--将请求结果返回workerPort.postMessage(JSON.stringify(res))// 如果主线程没有关闭worker,主线程可以让worker自焚// workerPort.close() //自毁
}/*** 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 e message data*/
workerPort.onmessageerror = (e: 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 e error message*/
workerPort.onerror = (e: ErrorEvent) => {
}

注意事项:
子线程在创建Worker时会自动生成文件,在生成的文件中处理逻辑。
在这里插入图片描述

四、效果展示

本次示例子线程给主线程发送了一个请求结果,我们用的是弹窗的形式展示
在这里插入图片描述
主线程给子线程发消息用的是控制台打印
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/498044.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 面试经典 150 题:矩阵置零

链接矩阵置零题序号73题型二维数组解题方法标记数组法难度中等熟练度✅✅✅✅ 题目 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1]…

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成

适用于项目经理的跨团队协作实践:Atlassian Jira与Confluence集成 现代项目经理的核心职责是提供可视性、保持团队一致,并确保团队拥有交付出色工作所需的资源。在过去几年中,由于分布式团队的需求不断增加,项目经理这一角色已迅速…

MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】

1.打开MySQL的官网,选择下载(Download) MySQL[这里是图片001]https://www.mysql.com/cn/ 2.往下划点击MySQL Community(GPL)Downloads 3.要下载MySQL的jar包的选择Connector/J 4.进入后,根据自己的需求选择相应的版本 5.下载完成后,进行解压…

WPF 绘制过顶点的圆滑曲线 (样条,贝塞尔)

在一个WPF项目中要用到样条曲线,必须过顶点,圆滑后还不能太走样,捣鼓一番,发现里面颇有玄机,于是把我多方抄来改造的方法发出来,方便新手: 如上图,看代码吧: ----------…

北京某新能源汽车生产及办公网络综合监控项目

北京某新能源汽车是某世界500强汽车集团旗下的新能源公司,也是国内首个获得新能源汽车生产资质、首家进行混合所有制改造、首批践行国有控股企业员工持股的新能源汽车企业,其主营业务包括纯电动乘用车研发设计、生产制造与销售服务。 项目现状 在企业全…

【阅读笔记】《基于区间梯度的联合双边滤波图像纹理去除方法》

一、联合双边滤波背景 联合双边滤波(Joint Bilateral Filter, JBF)是一种图像处理技术,它在传统的双边滤波(Bilateral Filter, BF)基础上进行了改进,通过引入一个引导图(guidance image&#x…

VIM: Vision Mamba基于双向状态空间模型的高效视觉表示学习

这篇文章的主要内容可以概括如下: 背景与动机: 近年来,状态空间模型(SSM)在长序列建模中展现出巨大潜力,尤其是Mamba模型在硬件感知设计上的高效性。 然而,现有的SSM模型在处理视觉数据时面临…

京存SAN助力电子病历建设

引言 随着信息技术的快速发展,电子病历系统(EMR)已成为现代医疗的重要组成部分。电子病历不仅能够提高医疗服务的效率和质量,还能更好地保护患者的隐私和数据安全。作为国内领先的存储解决方案提供商,京存存储凭借其卓越的技术实力和丰富的实…

python利用selenium实现大麦网抢票

大麦网(damai.cn)是中国领先的现场娱乐票务平台,涵盖演唱会、音乐会、话剧、歌剧、体育赛事等多种门票销售。由于其平台上经常会有热门演出,抢票成为许多用户关注的焦点。然而,由于票务资源的有限性,以及大…

【疑难杂症】 HarmonyOS NEXT中Axios库的响应拦截器无法拦截424状态码怎么办?

今天在开发一个HarmonyOS NEXT的应用的时候,发现http接口如果返回的状态码是424时,我在axios中定义的拦截器失效了。直接走到了业务调用的catch中。 问题表现: 我的拦截器代码如下: 解决办法: 先说解决办法&#xff…

芊芊手印网站

据说25年是佛灯火(木火之年),财运之年 芊芊手印网站链接:芊芊手印-手相纹理素描线稿提取工具

“Gold-YOLO:基于聚合与分发机制的高效目标检测新范式”

🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年12月26日8点00分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文源地址(有视频&#xf…

工厂+策略模式之最佳实践(疾病报卡维护模块API设计)

目录 💻业务场景 🔧应用技术 ⚙概要流程 ❗开发注意 服务类上标注了 自定义注解 却无法直接利用getDeclaredAnnotation 获取 *Spring代理机制 代理机制的工作原理 代理的工作机制 代理的使用场景 已获取EmrXXXServiceImpl 的Class,如…

Linux驱动开发 IIC I2C驱动 编写APP访问EEPROM AT24C02

在嵌入式开发中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,广泛应用于与外设(如 EEPROM、传感器、显示屏等)进行数据交换。AT24C02 是一种常见的 I2C EEPROM 存储器,它提供 2Kbit…

闭包的理解

什么是闭包 在函数内层的作用域中访问函数外层的作用域中的变量,就形成了一个闭包,闭包会使其私有变量的生命周期得到提升至与外层作用域一致。 闭包特性: 1.拥有私有变量 2. 延长私有变量的生命周期 一般函数中的变量在函数被执行完成之…

实景三维点云处理专业软件ArcGIS根据DSM生成地表点云集

常见的实景三维处理软件及其特色功能如下: 一、专业实景三维建模软件 Agisoft Metashape 高精度建模:能够生成高精度的三维模型,精度可以达到厘米级甚至毫米级,适用于需要详细测量和分析的项目,如文物保护和建筑测量。…

计算机网络-L2TP Over IPSec基础实验

一、概述 上次我们进行了标准L2TP的配置,但是在最后我们在进行业务流量访问时看到流量是没有进行加密的,这就导致可能得安全风险,所以这里其实可以退像GRE那样调用IPSec框架来进行加密保护。 拓扑 数据不加密 现在需要配置IPSec,然…

怎么在VMware Workstation上安装Win11虚拟机?

Windows11虚拟机是免费的吗? Windows 11 虚拟机本身并不是免费的。你需要一个合法的 Windows 11 许可证才能在虚拟机中运行。不过,许多虚拟机软件(如 VirtualBox 和 VMware Workstation Player)本身是免费的,允许你创…

时间敏感网络中全面分析与调度的模型驱动方法

论文:A Model-Driven Approach for the Comprehensive Analysis and Scheduling in Time-Sensitive Networks》 背景与动机 TSN 的发展与应用领域:自 2012 年起,IEEE 802.1 TSN 任务组致力于开发通信标准,增强 IEEE 802 网络&…