Dart并发编程03-事件队列先于微任务队列

42 阅读1分钟

在一些场景下,我们希望先执行时间队列的代码,再执行微任务队列的代码。

编写下列代码:

void main(List<String> args) {
  print('任务1');

  Future(
    () => print('任务2')
  ).then(
    (value) => print('任务3')
  );

  Future(() => print('任务4'));

  print('任务5');
}

在执行之前,请先推断一下任务的执行顺序。

运行上面的代码,我们会得到下面的结果:

Connecting to VM Service at ws://127.0.0.1:52241/eM7dZHmr1EQ=/ws
任务1
任务5
任务2
任务3
任务4

Exited.

在这段代码中,任务1任务5 会放到微任务队列中,首先被依次执行。

两个 Future 封装的 任务2任务4,会放到微任务队列中,在 任务1任务5 执行完毕后,依次执行 任务2任务4.

那么,任务3 呢? 任务3 是同步执行的代码。关键字 then 确保在 任务2 执行完毕后,再执行 任务3. 又因为 任务3 是同步代码,要先于事件队列中的代码执行,因此,在执行完任务2后,先执行 任务3,再执行 任务4.