持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
基本概念
关于耗时操作
-
耗时操作
在开发中,常遇到网络请求、文件读取等耗时操作。如果在主线程完成这些耗时操作,那么就会阻塞主线程,出现卡 UI 的现象
-
解决耗时操作
处理耗时操作的方式,在不同的语言的中处理方式不同
-
开启多线程
在 oc、java 等语言中,解决耗时操作通常会开启一个新的线程,在新线程中执行耗时操作,操作完毕后通过线程间通信,将处理结果传递给主线程
-
单线程 + 事件循环
在 JavaScript 、Dart 等语言中,解决耗时问题通常是通过单线程加事件循环处理耗时操作
-
进程和线程
-
进程
序就对应了一个进程,每个进程之间是独立的,一个进程包括了运行中的程序和程序所使用到的内存和系统资源
-
线程
一个进程要想执行任务,必须得有一个线程,而且每一个进程中至少有一个线程。进程的所有任务都在线程中执行
同步和异步
同步和异步是指的消息通信的机制
-
同步
当程序调用一个任务后,在任务未执行完之前,程序一直处于一个等待的状态,当这个任务执行完毕之后,程序才会接着执行下面的逻辑。这个操作叫做同步
-
异步
当程序调用一个任务后,可以继续执行接下来的其他逻辑,不必等待这个任务执行的状态,当这个任务执行完毕之后会通知程序执行完毕。这操作叫做异步
-
示例
去买早餐,需要买油条和豆浆
-
同步
先去 A 店买油条,在 A 店等待老板将油条炸出之后,再去 B 店买豆浆
-
异步
先去 A 店买油条,不必等待炸油条的过程,接着去 B 店买豆浆,等待油条炸出之后老板会主动告诉你来取油条
-
阻塞和非阻塞
阻塞与非阻塞是指等待状态
-
阻塞:调用结果返回之前,当前线程会被挂起,调用线程只有在得到调用结果之后才会继续执行
-
非阻塞:调用执行之后,当前线程不会停止执行,只需要过一段时间来检查一下有没有结果返回即可
单线程的 Dart
-
根据上述概念可以知道,线程跟同步、异步没有直接的关系,单线程也是可以实现异步
-
Dart 是单线程的。单线程模型中主要就是在维护着一个事件循环
-
事件循环
-
事件循环是指将需要处理的事件全部放在一个事件队列里,如点击事件、网络请求、文件读取等等
-
在程序执行中,不断得从事件队列中取出事件,执行对应的代码逻辑,直到事件队列清空位置
-