• 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

     

     

  • 相关阅读:
    基数排序学习
    桶排序学习
    计数排序-不基于比较O(n)
    基尼系数
    拉普拉斯进行特征选择
    int ,long long等范围
    Codeforces780C
    51 Nod 1119
    字典树入门
    POJ 2531 暴力深搜
  • 原文地址:https://www.cnblogs.com/lulushen/p/14128485.html
Copyright © 2020-2023  润新知