1. 程式人生 > 實用技巧 >Dart基礎回顧——單執行緒模型

Dart基礎回顧——單執行緒模型

Dart 單執行緒模型

Java和OC都是多執行緒模型的程式語言,任意一個執行緒觸發異常且該異常未被捕獲時,就會導致整個程序退出。但Dart和JavaScript不會,它們都是單執行緒模型,執行機制很相似(但有區別)。

Dart在單執行緒中是以訊息迴圈機制來執行的,其中包含兩個任務佇列,一個是“微任務佇列”microtask queue,另一個叫做“事件佇列”event queue。微任務佇列的執行優先順序高於事件佇列。

Dart大致執行原理:先開啟app執行入口函式main(),執行完成之後,訊息機制啟動,先是會按照先進先出的順序逐個執行微任務佇列中的任務microtask,事件任務eventtask

執行完畢後便會退出,但是,在事件任務執行的過程中也可以插入新的微任務和事件任務,在這種情況下,整個執行緒的執行過程便是一直在迴圈,不會退出,而Flutter中,主執行緒的執行過程正是如此,永不終止。

在事件迴圈中,當某個任務發生異常並沒有被捕獲時,程式並不會退出,而直接導致的結果是當前任務的後續程式碼就不會被執行了,也就是說一個任務中的異常是不會影響其它任務執行的。

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

https://juejin.cn/post/6844903816618311688