在Dart中,实际上有两种队列:
事件队列
(event queue),包含所有的外来事件:I/O
、mouse events
、drawing events
、timers
、isolate
之间的信息传递。
微任务队列
(microtask queue),表示一个短时间内就会完成的异步任务。它的优先级最高,高于event queue,只要队列中还有任务,就可以一直霸占着事件循环。microtask queue添加的任务主要是由 Dart内部产生。
因为 microtask queue
的优先级高于event queue
,所以如果 microtask queue
有太多的微任务, 那么就可能会霸占住当前的event loop
。从而对event queue
中的触摸、绘制等外部事件造成阻塞卡顿。
在每一次事件循环中,Dart总是先去第一个microtask queue
中查询是否有可执行的任务,如果没有,才会处理后续的event queue
的流程。
正如上面的流程图,当main
方法退出后,event
循环就开始它的工作。首先它会以FIFO
的顺序执行micro task
,当所有micro task
执行完后它会从event 队列
中取事件并执行。如此反复,直到两个队列都为空。
2.Dart的单线程执行
当一个Dart应用
开始的标志
是它的main isolate
执行了main方法
。当main方法
退出后,main isolate
的线程就会去逐一处理
消息队列中的消息。
网友评论