1. 前置学习文档
- 1.1 【HarmonyOS NEXT】ArkTs数据类型解析与使用
- 1.2 【HarmonyOS NEXT】ArkTs函数、类、接口、泛型、装饰器解析与使用
- 1.3 【HarmonyOS NEXT】ArkTs 模块的导出和引入
- 1.4 【HarmonyOS NEXT】异步编程的神器之Promise
2. 前言
在了解 ArkTS 线程模型之前,先了解几组易混淆的概念。
2.1 名词解释
-
进程(Process):进程是系统资源分配和调度的单元。一个运行着的程序就对应了一个进程。一个进程包括了运行中的程序和程序所使用到的内存和系统资源。
- 目前HarmonyOS 当前不支持手动创建进程;应用中(同一Bundle名称)的所有UIAbility、ServiceExtensionAbility和DataShareExtensionAbility 等其它Ability均是运行在同一个独立进程(主进程)中;
- 关于HarmonyOS中的进程模型,可点击这里阅读:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/process-model-stage-V13
线程(Thread):线程是进程下的执行者,一个进程至少开启一个线程(主线程),也可以开启多个线程。
-
**线程(Thread):**线程是进程下的执行者,一个进程至少开启一个线程(主线程),也可以开启多个线程。
并行和并发的概念:
- 并行(Parallelism):指程序的运行状态,在同一时间内有几件事情并行在处理。由于一个线程在同一时间只能处理一件事情,所以并行需要多个线程在同一时间执行多件事情。
- 并发(Concurrency):指程序的设计结构,在同一时间内多件事情能被交替地处理。重点是,在某个时间内只有一件事情在执行。比如单核 CPU 能实现多任务运行的过程就是并发。
阻塞和非阻塞的概念: - 阻塞(Blocking):阻塞是指调用在等待的过程中线程被挂起(CPU 资源被分配到其他地方去)
- 非阻塞(Non-blocking):非阻塞是指等待的过程 handlerCPU 资源还在该线程中,线程还能做其他的事情
再来区分单线程和多线程的区别:
- 单线程:从头执行到尾,逐行执行,如果其中一行代码报错,那么剩下代码将不再执行。同时容易代码阻塞。
- 多线程:代码运行的环境不同,各线程独立,互不影响,避免阻塞。
同步与异步的概念:
- 同步(Synchronous):程序发出调用的时候,一直等待直到返回结果,没有结果之前不会返回。也就是,同步时调用者主动等待调用过程,且能立即得到结果的。
- 异步(Asynchronous):程序发出调用之后,无法立即得到结果,需要额外的操作才能得到预期的结果是为异步。
2.2 ArkTS 运行环境
ArkCompiler eTS Runtime,类似于 Java 中的执行引擎 JVM【负责 Java 字节码的解析和执行】,Chrome Webkit 中 JavaScript 的执行引擎 V8 引擎【负责 JavaScript 代码的解析和执行】。
它的大致流程就是先通过 ArkCompiler 将 ArkTS/TS/JS 程序预先静态编译为方舟字节码,在真机上使用 ets_runtime 运行方舟字节码【负责 ArkTS 字节码的解析和执行】。
-
ets_runtime 源码地址:https://gitee.com/openharmony/arkcompiler_ets_runtime
-
ets_runtime 源码部分目录
3. 线程模型
本文涉及到的线程模型主要是基于官方的应用模型>Stage 模型。更多应用模型可点击这里:
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/application-models-V13
3.1 概述
Stage 模型下的线程主要有如下三类:
-
主线程
-
- 用于执行耗时操作,支持设置调度优先级、负载均衡等功能,推荐使用。
-
Worker线程
- 用于执行耗时操作,支持线程间通信。
TaskPool与Worker的运作机制、通信手段和使用方法可以参考TaskPool和Worker的对比。
- 用于执行耗时操作,支持线程间通信。
3.2 Stage 模型>主线程
从上述资料中,我们不难发现 ArkTS 的线程机制还是依托于 JavaScript 来实现的。而** JavaScript 是一门单线程语言**,所谓单线程,是指在 JS 引擎中负责解释和执行 JavaScript 代码的线程只有一个。不妨叫它主线程。
但是实际上还存在其他的线程。例如:处理 Http 网络请求的线程、处理 UI 事件的线程、定时器线程、读写文件的线程等等。这些线程可能存在于 JS 引擎之内,也可能存在于 JS 引擎之外,在此我们不做区分。不妨叫它们工作线程。
3.3 同步与异步
既然 js 是单线程,那么只要有一个任务耗时很长,后面的任务都必须排队等着,会拖延整个程序的执行,为了解决这个问题,JavaScript 语言将任务的执行模式分为两种:同步和异步。
3.3.1 同步
假设存在一个函数 A:
function A(args...);
如果在函数 A 返回的时候,调用者就能够得到预期结果(即拿到了预期的返回值或者看到了预期的效果),那么这个函数就是同步的。
例如:
let number=Math.abs(-666)
console.log(number)