dart是一个单线程语言但是同时又支持异步操作
多线程的概念:
多线程并非是异步,这是两种概念
多线程是开辟另外一个线程来处理事件,每个线程都有单独的事件队列,互不影响,这个新线程和主线程是并列执行的,只不过共享数据空间。
异步则是将异步任务和当前线程的任务分开,异步任务后面的任务,不会等待异步任务执行完再执行,而是直接执行,
dart中有两种队列分别是事件队列以及微任务队列
(1)事件队列(Event queue):包括所有的外来事件
(2)微任务队列(Microtask queue):表示一个短时间内会完成的一步任务,他的优先级是最高的
在事件循环中,dart总是先查询微任务队列是否有可执行的任务,如果没有才去执行事件队列,
所以如果微任务有过多的任务,就会霸占当前的事件循环,造成阻塞卡顿
为了保证渲染和其他功能性不卡顿,我们可以尽量将耗时等操作放在Event queue (事件队列)中进行操作
async:异步函数标识,一般与await和Future配合使用,如果一个函数是异步的,他一般表示开始一个异步操作,这时候如果它有返回值那么一定要返回Future否则就会报错
await:等待异步结果返回,一般加载Futute函数体之前,表明后面的代码需要等待
Future函数体内的内容执行完在执行,实现同步执行.
单独给函数添加async
关键字, 没有意义,函数是否是异步的,主要看Future
Future<T>
类,其表示一个 T 类型的异步操作结果。如果异步操作不需要结果,则类型为Future<void>
。也就是说首先Future是个泛型类,可以指定类型。如果没有指定相应类型的话,则Future会在执行动态的推导类型。
Future的工厂构造函数,工厂构造函数并不会自己生成实例,而是通过
代码来决定返回的实例对象,在Dart中在构造方法前面使用关键词factory(工厂)就可以变成工厂构造函数,就是说可以放在命名函数前也可以放在命名函数后
//未完成多线程学习,剩下等待学习完成后补上