Java开发人员从了学习ArkTs笔记(三)-数据结构与线程通信全解析

大家好,我是一名热爱Java开发的开发人员。目前,我正在学习ARKTS(Advanced Java Knowledge and Technology Stack),并将不断输出我的学习笔记。我将在这里分享我学习ARKTS的过程和心得,希望能够为其他开发人员提供一些有价值的参考和帮助。让我们一起探索ARKTS的奥秘,共同进步!

ArkTS是一种为构建高性能应用而设计的编程语言。ArkTS在继承TypeScript语法的基础上进行了优化,以提供更高的性能和开发效率。本文,主要是对ArkTs常用数据结构,进行实际使用、总结输出。

1.疑问、探索

1.1 疑问一:在哪里?

前面两文,我们学完了arkts基础知识、函数、类,接下来,想要看一下arkts支持的数据结构有哪些?可是一查官方文档,居然
在这里插入图片描述
突然产生了很大的疑惑,那arkts如果实现key-value、list等数据的存储呢?
抱着试一试的态度,在代码中,如下编码
在这里插入图片描述
好在,IDE给了我们提示,要求

import { HashMap } from '@kit.ArkTS';

我们顺势,点击查看一下这个包里面的类和方法有哪些。

/** Copyright (c) 2022-2023 Huawei Device Co., Ltd.* Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**     http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*//*** @file* @kit ArkTS*/import buffer from '@ohos.buffer';
import convertxml from '@ohos.convertxml';
import process from '@ohos.process';
import taskpool from '@ohos.taskpool';
import uri from '@ohos.uri';
import url from '@ohos.url';
import ArrayList from '@ohos.util.ArrayList';
import util from '@ohos.util';
import Deque from '@ohos.util.Deque';
import HashMap from '@ohos.util.HashMap';
import HashSet from '@ohos.util.HashSet';
import LightWeightMap from '@ohos.util.LightWeightMap';
import LightWeightSet from '@ohos.util.LightWeightSet';
import LinkedList from '@ohos.util.LinkedList';
import List from '@ohos.util.List';
import PlainArray from '@ohos.util.PlainArray';
import Queue from '@ohos.util.Queue';
import Stack from '@ohos.util.Stack';
import TreeMap from '@ohos.util.TreeMap';
import TreeSet from '@ohos.util.TreeSet';
import Vector from '@ohos.util.Vector';
import worker, {DedicatedWorkerGlobalScope, ErrorEvent, Event, EventListener, EventTarget,MessageEvent, MessageEvents, PostMessageOptions, ThreadWorkerGlobalScope,WorkerEventListener, WorkerEventTarget, WorkerOptions
} from '@ohos.worker';
import xml from '@ohos.xml';
import JSON from '@ohos.util.json';
import lang from '@arkts.lang';
import ArkTSUtils from '@arkts.utils';
import collections from '@arkts.collections';
import stream from '@ohos.util.stream';
import Decimal from '@arkts.math.Decimal';export {ArrayList, convertxml, DedicatedWorkerGlobalScope, Deque, ErrorEvent, Event, EventListener,EventTarget, HashMap, HashSet, LightWeightMap, LightWeightSet, LinkedList, List, MessageEvent,MessageEvents, PlainArray, PostMessageOptions, Queue, Stack, ThreadWorkerGlobalScope, TreeMap,TreeSet, Vector, WorkerEventListener, WorkerEventTarget, WorkerOptions, buffer, process, taskpool,uri, url, util, worker, xml, JSON, lang, ArkTSUtils, collections, stream, Decimal
};

这一看,就柳暗花明了,原来都在这里,而且,大家也可以发现,这些动动,和java居然基本一样。

1.2 疑问二:原理上怎么实现的?

但是新的疑问来了,这个实现是怎么样的?难道arkts底层自己把这些数据结构实现了一遍?带着这个疑问,我们随便点击一个,例如hashmap,看一下它的实现是怎么样的?
在这里插入图片描述
在这里插入图片描述

我们一看这个类,hashmap拥有的功能,基本都有。但是有一个问题,随便看一个方法,他没有实现呀?那怎么做的呢?
在这里插入图片描述
我们就不绕弯子了,还是翻到开头,这个类的定义开头,有一个关键字declare

declare class HashMap<K, V> {

在arkts中,我们可以使用declare关键字声明一个JavaScript模块,并通过import关键字将其导入到TypeScript代码中。然后,我们就可以像调用TypeScript函数一样调用JavaScript函数。

这下,这个疑问也就解答了,原来,arkts并未去重新实现这些数据结构,而是直接导入了JS的实现。
当然了,这时,可能会有小伙伴问,arkts、TypeScript、JavaScript到底有啥区别呢?

1.3 AS/TS/JS区别

区别与联系,这个我们借用官方的一段描述来说明一下,大家肯定就明白了。
JavaScript是一种属于网络的高级脚本语言,已经被广泛用于Web应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。
TypeScript 是 JavaScript 的一个超集,它扩展了 JavaScript 的语法,通过在JavaScript的基础上添加静态类型定义构建而成,是一个开源的编程语言。
ArkTS兼容TypeScript语言,拓展了声明式UI、状态管理、并发任务等能力,可以认为是TypeScript的超集。
由此可知,TypeScript是JavaScript的超集,ArkTS则是TypeScript的超集,他们的关系如下图所示。
在这里插入图片描述

2. 常用数据结构实践

接下来,我们对这个包 '@kit.ArkTS 中,常用的一些类和方法,做一下实践使用。

2.1 Hashmap

let map = new HashMap<number, string>();
map.set(1, "1")
map.set(2, "2")
map.set(3, "3")
map.forEach((value, key) => {console.log("key = " + key + "value = " + `${value}`);
});

2.2 ArrayList

let list = new ArrayList<Person>();
list.add(new Person("xiaoming", 23))
list.add(new Person("sdsad", 23))
for (let listElement of list) {console.log(listElement.name + "" + listElement.age)
}

2.3 HashSet

let mySet = new HashSet<string>();
mySet.add("key1")
mySet.add("key2")
mySet.forEach((value)=> {console.debug(value)
})
if (mySet.has("key1")) {}

2.4 Stack

let myStack = new Stack<string>()
myStack.push("fds")
myStack.push("fdsfds")
let fafdf = myStack.pop()
myStack.forEach((value) => {console.debug(value)
})

3.线程间通信

看这个 ‘@kit.ArkTS’,大家发现没有一个东东,觉得特别感兴趣,就是这个类:
在这里插入图片描述
这玩意,从名字看,就是线程类的方法。让我忍不住兴趣去研究一下,本来本文最初只决定研究一下常用数据结构的,看到这个,忍不住就扩充一下了。

我们带着疑问去看这个知识点,大家有没有一个疑问?android主子线程直接交互,有handler、thread、eventbus等,那arkts有不?

这个答案是很确定的,有的。

3.1 使用Worker进行线程间通信

Worker是与主线程并行的独立线程。创建Worker的线程被称为宿主线程,Worker工作的线程被称为Worker线程。创建Worker时传入的脚本文件在Worker线程中执行,通常在Worker线程中处理耗时的操作,需要注意的是,Worker中不能直接更新Page

Worker的开发步骤如下:

3.1.1 build-profile.json5配置

在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息。
在这里插入图片描述

 "buildOption": {"sourceOption" : {"workers" : ["./src/main/ets/works/works.ets"]}}

3.1.2 编写worker.ts

根据build-profile.json5中的配置创建对应的worker.ts文件。

import { worker } from '@kit.ArkTS'let handleMessage = worker.workerPort// 处理来自主线程的消息
handleMessage.onmessage = (message) => {console.debug("message " + message)// 发送消息给主线程handleMessage.postMessage("send message to main thread")
}

3.1.3 初始化和使用worker

主线程中使用如下方式初始化和使用worker

let workmsg = new worker.ThreadWorker("/works/works")// 发送消息到worker线程
workmsg.postMessage("message from main thread.")// 处理来自worker线程的消息
workmsg.onmessage = (message) => {console.info("message from worker: " + message);// 根据业务按需停止worker线程workmsg.terminate();
}

3.2 使用Emitter进行线程间通信

上面提到了,android 有eventbus这样的三方库,大家使用起来很简单,那么arkts有吗?答案是,有的。就是Emitter

Emitter主要提供线程间发送和处理事件的能力,包括对持续订阅事件或单次订阅事件的处理、取消订阅事件、发送事件到事件队列等。

Emitter的开发步骤如下:

3.2.1 订阅事件

@Sendable
class Sample {constructor() {this.count = 100;}printCount() {console.info('Print count : ' + this.count);}count: number;
}let callback = (eventData: emitter.GenericEventData<Sample>): void => {let storage: Sample = eventData.data!;storage.printCount();
};// 订阅eventId为"eventId"的事件,并在接收到此事件时执行上述定义的callback函数
emitter.once("eventId", callback);

3.2.2 发送事件

// 发送eventId为1的事件,事件内容为eventData
emitter.emit(event, eventData);

4.总结

本文对arkts,数据结构和线程通信机制有了更深刻的理解。ArkTS不仅继承了TypeScript的语法,还拓展了一系列高效的数据结构,如HashMap、ArrayList、HashSet等,这些数据结构的使用方法与Java非常相似,大大提升了开发效率。

此外,ArkTS的线程通信机制也让我印象深刻。通过使用Worker和Emitter,我们可以轻松实现线程间的数据传递和事件处理,这对于构建高性能应用至关重要。

总的来说,ArkTS是一门非常强大的编程语言,其数据结构和线程通信机制为我们提供了丰富的工具,让我们能够更高效地开发出优质的应用。如果你也对ArkTS感兴趣,不妨一试!

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java基础——预定义类/自定义类封装什么是Final类型

目录 预定义类——日历输出&#xff1a; 自定义类——在Java文件中&#xff1a; 什么是封装&#xff1f; 什么是final类型&#xff1f; 修饰变量&#xff1a; 修饰方法&#xff1a; 修饰类&#xff1a; 预定义类——日历输出&#xff1a; 例如&#xff1a;Math类、Date类…

spi 回环

///tx 极性0 &#xff08;sclk信号线空闲时为低电平&#xff09; /// 相位0 (在sclk信号线第一个跳变沿进行采样) timescale 1ns / 1ps//两个从机 8d01 8d02 module top(input clk ,input rst_n,input [7:0] addr ,input …

20241114软考架构-------软考案例16答案

每日打卡题案例16答案 16.【2017年真题】 难度&#xff1a;简单 阅读以下关于软件架构评估的叙述&#xff0c;在答题纸上回答问题1和问题2.(共25分) 【说明】 某单位为了建设健全的公路桥梁养护管理档案&#xff0c;拟开发一套公路桥梁在线管理系统。在系统的需求分析与架构设…

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子&#xff0c;没有网络&#xff0c;开个热点&#xff1f;续航不太行。随身WIFI&#xff1f;大多是百兆级网络。找人拉宽带&#xff1f;太麻烦&#xff0c;退租的时候也不能带着走。5G CPE倒是个不错的选择&#xff0c;插入SIM卡就能直接连接5G网络&#xff0c;千…

Python学习小记3-传递任意数量的实参

1.形参名*toppings 中的星号让Python创建一个名为toppings 的空元组&#xff0c;不管调用语句提供了多少实参&#xff0c;这个形参会将它们统统收入囊中&#xff0c;即&#xff1a;无论几个小料 def make_pizza(size, *toppings):print(f"\n要制作一个{size}-inch的披萨&…

宝塔 docker 部署onlyoffice 服务

1.宝塔安装docker,直接下载安装就行 2.docker拉取onlyoffice镜像 docker pull onlyoffice/documentserver:5.3.1.26 5.4或更高的版本已经解决了连接数限制方法的Bug 3.创建容器 docker run -d --name onlyoffice --restartalways -p 暴露端口号:80 onlyoffice/documentserv…

【数据结构副本篇】顺序表 链表OJ

&#x1f3dd;️专栏&#xff1a;【数据结构实战篇】 &#x1f305;主页&#xff1a;f狐o狸x 学习其实和打游戏一样&#xff0c;当你觉得BOSS难打的时候就说明是你的等级和装备不够&#xff0c;此时就需要我们多去刷刷副本&#xff0c;增加一点经验&#xff0c;顺便爆点装备出…

论文笔记(五十六)VIPose: Real-time Visual-Inertial 6D Object Pose Tracking

VIPose: Real-time Visual-Inertial 6D Object Pose Tracking 文章概括摘要I. INTRODACTIONII. 相关工作III. APPROACHA. 姿态跟踪工作流程B. VIPose网络 文章概括 引用&#xff1a; inproceedings{ge2021vipose,title{Vipose: Real-time visual-inertial 6d object pose tra…

AI风向标|算力与通信的完美融合,SRM6690解锁端侧AI的智能密码

当前&#xff0c;5G技术已经成为推动数字经济和实体经济深度融合的关键驱动力&#xff0c;进入5G发展的下半场&#xff0c;5G与AI的融合正推动诸多行业的数字化转型和创新发展&#xff0c;终端侧AI和端云混合式AI将广泛应用于各类消费终端和各行各业。 在推动5G和AI与各行业场…

封装一个省市区的筛选组件

筛选功能&#xff1a;只能单选&#xff08;如需多选需要添加show-checkbox多选框属性&#xff09;&#xff0c;选中省传递省的ID&#xff0c;选中市传递省、市的ID&#xff0c; 选中区传递省市区的ID 父组件&#xff1a; <el-form-item><div style"width: 240px;…

Liunx:共享内存

共享内存是实现进程间通信的又一个策略。 与管道在逻辑上相似&#xff0c;用户可以向OS申请&#xff0c;在物理内存中开辟一块空间&#xff0c;OS开辟并向上层返回这块空间的起始地址。需要通信的双方将这块空间通过页表映射&#xff0c;各自的挂载到自己进程地址空间的共享区。…

STM32 创建一个工程文件(寄存器、标准库)

首先到官网下载对应型号的固件包&#xff1a; 像我的STM32F103C8T6的就下载这个&#xff1a; 依次打开&#xff1a; .\STM32F10x_StdPeriph_Lib_V3.5.0\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm 可以看到&#xff1a; 这…

鸿蒙HarmonyOS 地图不显示解决方案

基于地图的开发准备已完成的情况下&#xff0c;地图还不显式的问题 首先要获取设备uuid 获取设备uuid 安装DevEco Studio的路径下 有集成好的hdc工具 E:\install_tools\DevEco Studio\sdk\default\openharmony\toolchains 这个路径下打开cmd运行 进入“设置 > 关于手机…

主机型入侵检测系统(HIDS)——Elkeid在Centos7的保姆级安装部署教程

一、HIDS简介 主机型入侵检测系统(Host-based Intrusion Detection System 简称:HIDS);HIDS作为主机的监视器和分析器,主要是专注于主机系统内部(监视系统全部或部分的动态的行为以及整个系统的状态)。 HIDS使用传统的C/S架构,只需要在监测端安装agent即可,且使用用户…

ArkUI---使用弹窗---@ohos.promptAction (弹窗)

promptAction.showToast&#xff08;文本提示框&#xff09; showToast(options: ShowToastOptions): void 创建并显示文本提示框&#xff0c;想看官方文档请点我 ShowToastOptions相关参数请点我 完整代码&#xff1a; import { promptAction } from kit.ArkUIEntry Componen…

leetcode104:二叉树的最大深度

给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xff1a;root [1,null,2] 输出…

CSS 语法规范

基本语法结构 CSS 的基本语法结构包含 选择器 和 声明块,两者共同组成 规则集。规则集可以为 HTML 元素设置样式,使页面结构和样式实现分离,便于网页的美化和布局调整。 CSS 规则集的结构如下: selector {property: value; }选择器(Selector) 选择器用于指定需要应用…

使用 Python 脚本在 Ansys Mechanical 中创建用于后处理的螺栓工具

介绍 由螺栓连接定义的接头在工业应用中非常普遍。在 Ansys Mechanical FEA 中分析它们是一种非常常见的做法。通过Object Generator或Bolt Tools Add-on&#xff0c;使用线体、梁连接甚至3D实体中的梁单元&#xff0c;在Ansys Mechanical中生成螺栓连接非常容易。定义螺栓联接…

【Excel】数据透视表分析方法大全

数据透视表的最常用的功能是分类汇总&#xff0c;其实它还有很强大的数据分析功能。在数据透视表右键菜单的值显示方式中&#xff0c;可以看到有14个很实用的分析选项。 1、总计的百分比 作用&#xff1a;透视表中每一个数字&#xff08;包括汇总行、总计行&#xff09;占右…

电子工牌独立双通道定向拾音方案(有视频演示)

现在一些行业的客服人员在面对客户都要求使用电子工牌分别记录客服和顾客的声音,我们利用双麦克风阵列双波束拾音的方案设计了一个电子工牌方案.可以有效分别记录客服和顾客的声音. 方案思路: 我们采用了一个双麦阵列波束拾音的模块A-59,此模块可以利用2个麦克风组成阵列进行双…