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

embedded/2024/11/18 13:21:53/

大家好,我是一名热爱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.ppmy.cn/embedded/138549.html

相关文章

Scala学习记录,case class,迭代器

case class case class创建的对象的属性是不可改的 创建对象&#xff0c;可以不用写new 自动重写&#xff1a;toString, equals, hashCode, copy 自动重写方法&#xff1a;toString,equals,hashCode,copy 小习一下 1.case class 的定义语法是什么 基本形式&#xff1a;case …

数据结构王道P234第二题

#include<iostream> using namespace std; int visit[MAxsize]; int color[MaxSize];//1表示红&#xff0c;2表示白&#xff1b; bool dfs(Graph G, int i){visit[i]1;ArcNode *p;bool flag1;for(pG.vertices[i].firsrarc; p ; pp->next){int jp->adjvex;if(!visi…

Java-02 深入浅出 MyBatis - MyBatis 快速入门(无 Spring) POM Mapper 核心文件 增删改查

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

2024年11月第2个交易周收盘总结

计划自己的交易&#xff0c;交易自己的计划! 跟随市场而情绪波动&#xff0c;最终一定会导向失败&#xff01;连续、平稳、冷静地惯彻交易计划&#xff0c;比什么都重要&#xff01; 交易本身是极其简单和清楚的&#xff0c;让事情变复杂的原因不是行情走势和交易本身&#x…

request爬虫库的小坑

今天在做爬虫的时候&#xff0c;想要请求一个json数据&#xff0c; 地址为&#xff1a;https://weibo.com/ajax/profile/info?uidxxxxxxx ID就自己去找一个哈。。。。本来这个应该是一个json数据&#xff0c;但是我的pycharm却返回了一个html&#xff0c;我百思不得其解&…

Qt/C++ 开源控件 可折叠的标签管理控件

在 Qt 开发中&#xff0c;许多项目需要处理标签管理功能&#xff0c;例如分类管理、标签筛选等需求。本文将分享如何利用 Qt/C 实现一个具备动态增删标签、展开折叠功能的控件。此控件由 TagWindow 和 TagItemWidget 两个类组成&#xff0c;前者负责整个标签管理窗口的布局与逻…

Flink算子

文章目录 mapfilterflatMapkeyByaggregationsreduce物理分区算子富函数splitside outputunion(联合)connect(连接&#xff09; map Map 算子会遍历数据流的每一个元素产生一个新的元素。 public static void main(String[] args) throws Exception {StreamExecutionEnvironmen…

STM32 | 空气净化器

空气净化器 一、项目背景 空气净化器又称“空气清洁器”、空气清新机、净化器&#xff0c;是指能够吸附、分解或转化各种空气污染物&#xff08;一般包括PM2.5、粉尘、花粉、异味、甲醛之类的装修污染、细菌、过敏原等&#xff09;&#xff0c;有效提高空气清洁度的产品&…