dart是單線程 一定要記得很清楚
dart異步不同于java的線程凉当,java線程是搶占式篙骡,但dart相當(dāng)于開辟了一個(gè)新的進(jìn)程的線程柱锹,不會對當(dāng)前數(shù)據(jù)產(chǎn)生影響拜鹤,也就沒有所謂的鎖 這是單線程的好處
Isolate機(jī)制 isolate一般不會在代碼中直接使用
舉個(gè)栗子:
import 'dart:isolate';
void main() {
ReceivePort port = ReceivePort();
Isolate.spawn(fun, port.sendPort);///固定寫法
port.listen((t) {///這里是設(shè)置當(dāng)前receivePort 監(jiān)聽
print("接收到其他isolate發(fā)過來的消息闽巩!");///這里接收了其他isolate發(fā)送的消息
print(t);///接收到的為fun方法里面發(fā)送的消息
});
}
void fun(SendPort sendPort) {
var receivePort = new ReceivePort();
var port = receivePort.sendPort;
port.send("a");///發(fā)送消息
sendPort.send("---");///發(fā)送消息
receivePort.listen((t) {///這里是設(shè)置當(dāng)前receivePort 監(jiān)聽
print("接收到當(dāng)前isolate發(fā)過來的消息钧舌!");///這里接收了當(dāng)前發(fā)送的消息
print(t);
});
}
Isolate并行
Isolate相互之間不是會干擾的
import 'dart:isolate';
void main() {
Isolate.spawn(i1, "");
Isolate.spawn(i2, "");
}
void i1( msg) {
print("isolate1 執(zhí)行");
Future.doWhile((){///Future代表未來要做的事情
print("isolate1 future");
return true;
});
}
void i2( msg) {
print("isolate2 執(zhí)行");
Future.doWhile((){///Future代表未來要做的事情
print("isolate2 future");
return true;
});
}
Future
舉個(gè)文件讀取的栗子:
import 'dart:io';
void main() {
new File(r"C:\Users\hp\Desktop\test.txt") ///在前面使用r 就可以不適用轉(zhuǎn)義符號
.readAsString()
.then((t) {///then表示接下來要做的事情
print(t);
return "你好";///這里可以返回值 繼續(xù)傳給下一個(gè)then方法來使用
}).then((t) {///這里繼續(xù)使用then方法
print(t);
});
}
async await
async await 一般都是配合使用 他會阻塞 使其一步一步執(zhí)行
繼續(xù)舉個(gè)文件讀取的栗子:
import 'dart:io';
void main() {
ful().then((t){
print(t);
});
}
Future<String> ful() async {
String s1 = await new File(r"C:\Users\hp\Desktop\test.txt").readAsString();///這個(gè)執(zhí)行完才能往下執(zhí)行
String s2 = await new File(r"C:\Users\hp\Desktop\test1.txt").readAsString();
return "$s1\n$s2";
}
stream訂閱模式
只能單個(gè)訂閱,多個(gè)的話會報(bào)錯(cuò)
import 'dart:io';
void main() {
Stream<List<int>> stream = new File(r"C:\Users\hp\Desktop\test.txt").openRead();
stream.listen((_){
print("訂閱");
});
stream.listen((_){
print("訂閱");
});
}
但是將他變成廣播模式可以進(jìn)行多訂閱:
var broadcastStream = stream.asBroadcastStream();
broadcastStream.listen((_){
print("訂閱");
});
broadcastStream.listen((_){
print("訂閱");
});
廣播訂閱
由單訂閱轉(zhuǎn)換而來的 : 和單訂閱唯一的區(qū)別就是 允許多訂閱
var stream = Stream.fromIterable([1,2,3,4]);
var broadcastStream = stream.asBroadcastStream();
broadcastStream.listen((i){
print("訂閱者1:${i}");
});
broadcastStream.listen((i){
print("訂閱者2:${i}");
});
需要注意的地方:直接創(chuàng)建廣播涎跨,發(fā)送一條消息是不能接收到的
import 'dart:async';
void main(){
var streamController = StreamController.broadcast();
streamController.add("1");
streamController.stream.listen((i){
print("廣播:"+i);
});
streamController.close();
}
記得關(guān)閉