Flutter
默认是单线程任务处理的,如果不开启新的线程,任务默认在主线程中处理。
支持并发执行线程的高级语言(比如,C++、Java、Objective-C),大都以抢占式的方式切换线程,即:每个线程都会被分配一个固定的时间片来执行,超过了时间片后线程上下文将被抢占后切换。如果这时正在更新线程间的共享资源,抢占后就可能导致数据不同步的问题。
解决这一问题的典型方法是,使用锁来保护共享资源,但锁本身又可能会带来性能损耗,甚至出现死锁等更严重的问题。
这时,Dart 是单线程模型的优势就体现出来了,因为它天然不存在资源竞争和状态同步的问题。这就意味着,一旦某个函数开始执行,就将执行到这个函数结束,而不会被其他 Dart 代码打断。
所以,Dart 中并没有线程,只有 Isolate(隔离区)。Isolates 之间不会共享内存,就像几个运行在不同进程中的 worker,通过事件循环(Event Looper)在事件队列(Event Queue)上传递消息通信。
事件队列
和iOS应用很像,在Dart
的线程中也存在事件循环和消息队列的概念,但在Dart
中线程叫做isolate
。应用程序启动后,开始执行main
函数并运行main isolate
。
每个isolate
包含一个事件循环以及两个事件队列,event loop
事件循环,以及event queue