【dart线程之单线程和循环模型】

dart线程之单线程和循环模型

为什么说dart是单线程的?

单线程是什么?

  • 一旦某个Dart函数开始执行,它将执行到这个函数的结束而不被其他Dart代码打断,这就是单线程的特性。

dart是单线程的原因

  • Dart中线程并不是指Thread,而是指Isolate。Dart没有线程的概念。
  • 每个Isolate都是隔离的,并不会共享内存。
  • 因为隔离,所以具备了单线程是什么?里说的单线程的特性。

事件循环模型是什么?

  • 包含一个消息循环(event looper)、一个事件队列(event queue)、一个微任务队列(Microtask queue)。
    • 消息循环(event looper)
      • 永不停止,不断查询两个队列有无函数去执行
      • 微任务队列(Microtask queue)优先级高于事件队列(event queue),执行微任务队列(Microtask queue)时,事件队列(event queue)阻塞。
    • 事件队列(event queue)
      • 用户输入,点击,Timer,文件IO等
      • 通过Future添加
    • 微任务队列(Microtask queue)
      • 任务量必须要少,不然容易ANR
      • 通过scheduleMicrotask添加(sky_engine下的async包)(sky是flutter之前的名字哦)
  • 示例:
iimport 'dart:async';

void main(List args) {
  print('main start...');

  /// 创建异步event queue
  var futureInstance = Future(() => "12345");
  futureInstance.then((res) {
    print(res);
  }).catchError((err) {
    print(err);
  });

  /// 执行函数
  stark();

  /// scheduleMicrotask函数创建微任务MircroTask queue
  scheduleMicrotask(() => print('microtask #1 of 2'));
  print('main end...');

  /// scheduleMicrotask函数创建微任务MircroTask queue
  scheduleMicrotask(() => print('microtask #2 of 2'));
}

void stark() async {
  print('stark start...');

  /// 创建异步event queue
  var futureInstance = Future(() => "900303");

  /// 异步等待
  var rep = await futureInstance;
  print(rep);

  /// 创建异步event queue
  var futureInstance1 = Future(() => "xxxxx");
  futureInstance1.then((res) {
    print(res);
  }).catchError((err) {
    print(err);
  });

  print('stark end...');
}

// 执行顺序:
// main start...
// stark start...
// main end...
// microtask #1 of 2
// microtask #2 of 2
// 12345
// 900303
// stark end...
// xxxxx

备注:通过查阅一些资料学习到的,如有错误,烦请指正。

你可能感兴趣的:(flutter,flutter,线程,dart)