Flutter - Dart 基础(单线程异步相关概念)

396 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

基本概念

关于耗时操作

  • 耗时操作

    在开发中,常遇到网络请求、文件读取等耗时操作。如果在主线程完成这些耗时操作,那么就会阻塞主线程,出现卡 UI 的现象

  • 解决耗时操作

    处理耗时操作的方式,在不同的语言的中处理方式不同

    • 开启多线程

      在 oc、java 等语言中,解决耗时操作通常会开启一个新的线程,在新线程中执行耗时操作,操作完毕后通过线程间通信,将处理结果传递给主线程

    • 单线程 + 事件循环

      在 JavaScript 、Dart 等语言中,解决耗时问题通常是通过单线程加事件循环处理耗时操作

进程和线程

  • 进程

    序就对应了一个进程,每个进程之间是独立的,一个进程包括了运行中的程序和程序所使用到的内存和系统资源

  • 线程

    一个进程要想执行任务,必须得有一个线程,而且每一个进程中至少有一个线程。进程的所有任务都在线程中执行

同步和异步

同步和异步是指的消息通信的机制

  • 同步

    当程序调用一个任务后,在任务未执行完之前,程序一直处于一个等待的状态,当这个任务执行完毕之后,程序才会接着执行下面的逻辑。这个操作叫做同步

  • 异步

    当程序调用一个任务后,可以继续执行接下来的其他逻辑,不必等待这个任务执行的状态,当这个任务执行完毕之后会通知程序执行完毕。这操作叫做异步

  • 示例

    去买早餐,需要买油条和豆浆

    • 同步

      先去 A 店买油条,在 A 店等待老板将油条炸出之后,再去 B 店买豆浆

    • 异步

      先去 A 店买油条,不必等待炸油条的过程,接着去 B 店买豆浆,等待油条炸出之后老板会主动告诉你来取油条

阻塞和非阻塞

阻塞与非阻塞是指等待状态

  • 阻塞:调用结果返回之前,当前线程会被挂起,调用线程只有在得到调用结果之后才会继续执行

  • 非阻塞:调用执行之后,当前线程不会停止执行,只需要过一段时间来检查一下有没有结果返回即可


单线程的 Dart

  • 根据上述概念可以知道,线程跟同步、异步没有直接的关系,单线程也是可以实现异步

  • Dart 是单线程的。单线程模型中主要就是在维护着一个事件循环

  • 事件循环

    • 事件循环是指将需要处理的事件全部放在一个事件队列里,如点击事件、网络请求、文件读取等等

    • 在程序执行中,不断得从事件队列中取出事件,执行对应的代码逻辑,直到事件队列清空位置