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之前的名字哦)
- 消息循环(event looper)
- 示例:
iimport 'dart:async';
void main(List<String> args) {
print('main start...');
/// 创建异步event queue
var futureInstance = Future<String>(() => "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<String>(() => "900303");
/// 异步等待
var rep = await futureInstance;
print(rep);
/// 创建异步event queue
var futureInstance1 = Future<String>(() => "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
备注:通过查阅一些资料学习到的,如有错误,烦请指正。