dart单线程事件轮询

2,260 阅读1分钟

Dart单线程核心包括:主线程、微任务和宏任务

微任务队列:包含微任务,主要通过scheduleMicrotask来调度

事件队列:事件队列包括外部事件,例如I/O,Timer、绘制事件等

截屏2022-05-07 下午9.22.22.png

例子:

void main() {
  print('flow start');

  Timer.run(() {
    print('event-A');

    scheduleMicrotask(() {
      print('microtask-B in event-A');
    });
    scheduleMicrotask(() {
      print('microtask-C in event-A');
    });
  });

  scheduleMicrotask(() {
    print('microtask-A');

    Timer.run(() {
      print('event-B in microtask-A');
    });
  });

  print('flow end');
}

输出结果:

flow start
flow end
microtask-A
event-A
microtask-B in event-A
microtask-C in event-A
event-B in microtask-A

总结:dart会有一个调用栈,一个事件队列,一个微任务队列 从main函数开始,首先执行同步任务,如果异步事件就会加入事件队列,先不执行等待轮询,如果如果微任务就加入微任务队列,先不执行等待轮询。main函数执行完毕,开始轮询,首先看微任务队列里有没有任务,如果有就执行微任务,直到执行完队列里所有微任务,然后执行事件队列里的任务,以此循环

参考:

事件轮询动态演示