dart 語言的異步 同步 構造器 隔離 元註解 註釋方式bash
下面依次調用 三個方法 輸出的順序爲1--3--4--2--5
await該關鍵字會執行暫停當前線程 等外部執行完畢再執行剩下的異步
main() async {
// async wait
getName1();
getName2();
getName3();
}
複製代碼
/ async wait
Future<void> getName1() async {
// getStr1();//能夠不用await打斷點看下await後的區別
await getStr1(); //遇到第一個await表達式執行暫停,返回future對象,await表達式執行完成後繼續執行
await getStr2(); //await表達式能夠使用屢次
print('5');
}
getStr1() {
print('1');
}
getStr2() {
print('2');
}
getName2() {
print('3');
}
getName3() {
print('4');
}
複製代碼
每次新建一個Future 會將這個Future添加到隊列當中 先添加先執行 下面代碼的輸入順序爲f7--f1--f6--f3--f5--ff2--f4
async
void testFuture() {
Future f = new Future(() => print("f1"));
Future f1 = new Future(() => null); //7163524
// Future f1 = new Future.delayed(Duration(seconds: 1) ,() => null);//7132465
Future f2 = new Future(() => null);
Future f3 = new Future(() => null);
f3.then((_) => print("f2"));
f2.then((_) {
print("f3");
new Future(() => print("f4"));
f1.then((_) {
print("f5");
});
});
f1.then((m) {
print("f6");
});
print("f7");
}
複製代碼
微隊列會優先與隊列執行,微隊列執行會在當前正在執行的Future任務 執行完纔會去執行微隊列的任務, 若是then返回一個future任務那這個任務也會放到隊列中, delayed延遲隊列會在最後執行 下面的代碼輸出順序爲s9--s1--s8--s3--s4--s6--s5--s10--s7--s11--s12--s2
ide
void testScheduleMicrotask() {
//918346572
scheduleMicrotask(() => print('s1'));
new Future.delayed(new Duration(seconds: 1), () => print('s2'));
new Future(() => print('s3')).then((_) {
print('s4');
scheduleMicrotask(() => print('s5'));
}).then((_) => print('s6'));
new Future(() => print('s10'))
.then((_) => new Future(() => print('s11')))
.then((_) => print('s12'));
new Future(() => print('s7'));
scheduleMicrotask(() => print('s8'));
print('s9');
}
複製代碼
全部的 Dart 代碼在 isolates 中運行而不是線程。 每一個 isolate 都有本身的堆內存,而且確保每一個 isolate 的狀態都不能被其餘 isolate 訪問。 其實 一個main方法就是一個隔離函數
main() async {
var receivePort = new ReceivePort();
await Isolate.spawn(echoo, receivePort.sendPort);
receivePort.listen((s) {
if (s is SendPort) {
s.send("不我想要桃子");
} else
print(s);
});
}
/// 新isolate的入口函數
echoo(SendPort sendPort) async {
// 實例化一個ReceivePort 打開接收端口以接收消息
var port = new ReceivePort();
// 把它的sendPort發送給宿主isolate,以便宿主能夠給它發送消息
sendPort.send(port.sendPort);
sendPort.send("給你爛蘋果");
// 監聽循環接收消息
port.listen((s) {
print(s);
});
}
複製代碼
sync* async用於生成 Iterrable 和 Stream yield yield 優化性能性能
返回值是Iterable 須要調用 moveNext() 纔會執行迭代優化
//調用getSyncGenerator當即返回Iterable
var it = getSyncGenerator(5).iterator;
// 調用moveNext方法時getSyncGenerator纔開始執行
while (it.moveNext()) {
print(it.current);
}
//同步生成器: 使用sync*,返回的是Iterable對象
Iterable<int> getSyncGenerator(int n) sync* {
print('start');
int k = n;
while (k > 0) {
//yield會返回moveNext爲true,並等待 moveNext 指令
yield k--;
}
print('end');
}
複製代碼
返回值是Stream 執行了只有執行了listen以後函數纔會執行,也能夠使用能夠使用StreamSubscription對象對數據流進行控制ui
//調用getAsyncGenerator當即返回Stream,只有執行了listen,函數纔會開始執行
// getAsyncGenerator(5).listen((value) => print(value));
StreamSubscription subscription = getAsyncGenerator(5).listen(null);
subscription.onData((value) {
print(value);
if (value >= 2) {
subscription.pause(); //能夠使用StreamSubscription對象對數據流進行控制
}
});
//異步生成器: 使用async*,返回的是Stream對象
Stream<int> getAsyncGenerator(int n) async* {
print('start');
int k = 0;
while (k < n) {
//yield不用暫停,數據以流的方式一次性推送,經過StreamSubscription進行控制
yield k++;
}
print('end');
}
複製代碼
//同步
var it1 = getSyncRecursiveGenerator(5).iterator;
while (it1.moveNext()) {
print(it1.current);
}
//異步
getAsyncRecursiveGenerator(5).listen((value) => print(value));
//遞歸生成器:使用yield*
Iterable<int> getSyncRecursiveGenerator(int n) sync* {
if (n > 0) {
yield n;
yield* getSyncRecursiveGenerator(n - 1);
}
}
//異步遞歸生成器
Stream<int> getAsyncRecursiveGenerator(int n) async* {
if (n > 0) {
yield n;
yield* getAsyncRecursiveGenerator(n - 1);
}
}
複製代碼
class Todo {
final String who;
final String what;
const Todo({this.who, this.what});
}
複製代碼
// 這是單行註釋
複製代碼
/*
* 這是多行註釋
* 這是多行註釋
*/
複製代碼
兩種方式
/// 這是文檔註釋
/**
* 這是文檔註釋
*/
複製代碼