
前言
任务是什么呢?是今天要早睡,明天要早起。Dart中的任务也和我们生活中的任务一样,是予以指派的特定工作(如我给自己指派今天早睡),只不过Dart是通过事件循环 和任务队列管理任务执行顺序。同生活中任务的划分,Dart中也会对任务进行划分,它按照不同的规则将任务划分为同步任务、异步任务、微任务等。那Dart中的任务具体是啥样的呢?准备好,跟随脚步,我们一起去看看。
一、任务的定义
学习一个新知识,我们首先得知道学习的新知识是什么。那我们怎么知道这个知识是啥呢?知识的定义给出了答案,它以一个最快最简洁的方式让我们认识新的内容。下面我们分别给出生活中、计算机中、Dart中关于任务的定义。
- 生活中的任务:指指派予个体或团队的特定工作或职责,也可是个体主动规划的事项,由个人或团体执行。例如快递站站长给骑手指派今天完成的单量。
- 计算机中的任务:指由操作系统调度器管理的逻辑工作单元,其执行依托于线程或进程资源。例如数据处理、网络请求等具体操作。
- Dart中的任务:指程序要实现的具体目标(如发请求、读文件),所有任务均由Dart主线程负责执行。
看完了定义,任务都有哪些要点呢?
答:1、任务需要消耗资源。 理由:生活中骑手完成单量这个任务需要耗费人力、车损等资源;计算机中执行任务需要依托进程执行,需要使用到分配给进程的资源;Dart中任务都由主线程执行,而线程执行需要使用进程的资源。
2、任务可并行或并发执行。 理由:生活中任务并行执行如一边吃饭一边追剧,并发如吃一会看一会儿再吃一会;计算机中任务可以被多个进程、线程同时处理(并行),也可被一个进程或线程处理(并发执行);Dart中依靠主线程交错执行任务(并发),依靠事件循环和任务队列实现并发执行。
3、任务具有状态。 理由:生活中如骑手有取餐中、配送中、配送结束;计算机中任务依托线程、进程执行就具有了进程的创建态、就绪态、运行态、阻塞态等;Dart中依赖主线程执行当然就具有计算机中线程的状态了。
4、任务具有目标导向。理由:生活中骑手目标为送餐到客户手中;计算机中达到某种效果;Dart中也是为了完成一定的目标。
二、Dart中任务的分类
我们主要介绍按照执行方式划分的任务,将任务划分为两类,分别为同步任务、异步任务。
2.1、同步任务
这类任务必须按照一定的顺序执行,若前一个任务未执行完成,则后一个任务便不能执行,必须等待前一个任务完成,就像是我们生活中的排队一样,得先等待前一个人处理完了,才能到你。

示例:
Dart
void main() {
print('任务1'); // 同步代码,最先开始执行,意味着最先打印这行。
print('任务2');
for(int i = 0; i < 100000; i++){} // 需要耗费时间的同步代码
print('任务3'); // 需要等待前面的同步代码执行完才能执行。
print('任务4');
}
输出:
任务1
任务2
任务3
任务4
注意:Dart中同步任务比异步任务先执行。
2.2、异步任务
为解决排队过程中的处理时间较长,导致后面排队等待过长。生活中采取了发短信通知等方式解决此问题,而在Dart中采用异步任务的方式解决此问题。那异步是咋解决的呢?异步任务通常是一个耗时的操作(如网络请求),异步任务并不会等待,但会贴出告示说自己完成没有,就像发短信通知状态一样。了解了异步任务是咋回事,我们来看看Dart异步任务的分类。
异步任务的分类:
-
微任务:指优先级较高的异步任务。
-
事件任务:指由外部事件触发的异步任务,如网络响应等。他的优先级低于微任务。
同步任务与异步任务的执行顺序如下图所示。

三、Dart中异步任务的状态
在此部分,我们先回顾一下操作系统中任务的状态。然后再看Dart中异步任务的状态。
3.1、操作系统中任务的状态
- 创建:操作系统为任务分配好资源,并未准备好执行。
- 就绪:所有资源准备完备,只差CPU。
- 运行:任务在CPU上执行指令。
- 阻塞:执行过程中发生某些事件而暂停执行。如等待I/O操作完成。
- 终止:任务成功完成了或失败了。操作系统回收分配的资源。

3.2、Dart中异步任务的状态
- 创建(created):任务被创建。
- 待定(pending):任务开始执行,但未完成。
- 执行(running):异步操作正在执行。
- 完成(completed):分为两种状态,成功完成和失败完成。
- 清理(dispose):释放资源。

四、总结
本小节从日常生活中的任务出发,首先对比生活中、计算机中、Dart中任务的定义,引出任务都具有的要点。然后在了解任务的基础上,介绍了Dart中按执行方式划分的任务分类,主要分为同步任务和异步任务,其中异步任务中简述了微任务与事件任务。最后在回顾了操作系统中任务的状态基础上介绍了Dart中异步任务的状态。
任务要点 | Dart中任务的分类 | Dart中异步任务的状态 |
---|---|---|
任务需要消耗资源 | 同步任务 (最先执行) | 创建(Created) |
任务可并行或并发执行 | 异步任务(所有同步任务执行完才执行) | 待定(Pending) |
任务具有状态 | 微任务 (异步任务中优先级最高) | 执行(Running) |
任务具有目标导向 | 事件任务(一般优先级) | 完成(Completed) |
清理(Disposed) |