第一个问题是事件循环何时开始?我在一个网站上读到它是在main方法之后开始的但是为什么当我们尝试这样的事情
main()async {
Future(()=>print('future1'));
await Future(()=>print('future2'));
print('end of main');
}
//the output is :
//future1
//future2
//end of main
在此示例中,当我们使用await关键字和事件循环到达future2之后,它会暂停吗?还是我错了:(
第二个问题是如何将事件添加到事件队列中如果是FIFO,为什么在此示例中,将来2在未来1
main(){
Future.delayed(Duration(seconds:5) , ()=>print('future1'));
Future.delayed(Duration(seconds:2) , ()=>print('future2'));
}
[事件循环在没有其他东西运行时运行(例如main方法已完成,您正在等待将来完成)。
您的例子很有意义,因为第一行将事件放在事件队列上,所以现在队列中的第一项是“ print('future1')”。在下一行中,您将另一个事件放在队列中,该事件称为“ print('future2')”,现在您等待此事件完成。
由于您的main方法没有等待什么,所以将执行事件循环。由于队列上的第一个事件是“ print('future1')”,因此将首先执行该事件。但是由于主要方法仍在等待将来的“ print('future2')”完成,因此事件循环将执行另一个要执行的事件,该事件将是“ print('future2')”。]
由于此事件是主要方法正在等待的事件(并且事件队列中没有其他事件,所以main()将运行最后一个调用“ print('main of end')”。]]
在下一个示例中,您认为Future和Future.delayed是相同的,但事实并非如此。使用Future.delayed之前,事件队列中没有任何事件。取而代之的是,在VM外部运行了一个线程,该线程知道何时触发下一个计时器,最终将事件放入队列。因此,仅在计时器到期时才将事件放入事件队列中(因此,将首先执行future2)。