Dart基礎回顧——單執行緒模型
Dart 單執行緒模型
Java和OC都是多執行緒模型的程式語言,任意一個執行緒觸發異常且該異常未被捕獲時,就會導致整個程序退出。但Dart和JavaScript不會,它們都是單執行緒模型,執行機制很相似(但有區別)。
Dart在單執行緒中是以訊息迴圈機制來執行的,其中包含兩個任務佇列,一個是“微任務佇列”microtask queue,另一個叫做“事件佇列”event queue。微任務佇列的執行優先順序高於事件佇列。
Dart大致執行原理:先開啟app執行入口函式main(),執行完成之後,訊息機制啟動,先是會按照先進先出的順序逐個執行微任務佇列中的任務microtask,事件任務eventtask
在事件迴圈中,當某個任務發生異常並沒有被捕獲時,程式並不會退出,而直接導致的結果是當前任務的後續程式碼就不會被執行了,也就是說一個任務中的異常是不會影響其它任務執行的。
Dart 中事件的執行順序:Main > MicroTask > EventQueue
通常使用 scheduleMicrotask(…)或者Future.microtask(…)方法向微任務佇列插入一個任務。
通常使用 Future 向 EventQueue加入事件,也可以使用 async 和 await 向 EventQueue 加入事件。
例如:
void run(){ Future(() async { print("EvenTask1"); }); evenTest(); Future(() async{ print("EvenTask2"); await Future((){ print("EvenTask4"); }); print("EvenTask3"); }); Future.microtask(()=> print("MicroTask1")); scheduleMicrotask((){ print("MicroTask2"); }); print("main"); } void evenTest() async{ await Future((){ print("EvenTask5"); }); }
輸出結果是:
在Dart中,所有的外部事件任務都在事件佇列中,如IO、計時器、點選、以及繪製事件等,而微任務通常來源於Dart內部,並且微任務非常少,之所以如此,是因為微任務佇列優先順序高,如果微任務太多,執行時間總和就越久,事件佇列任務的延遲也就越久,對於GUI應用來說最直觀的表現就是比較卡,所以必須得保證微任務佇列不會太長。
參考文件:
https://book.flutterchina.club/chapter2/thread_model_and_error_report.html