dart是单线程 一定要记得很清楚
dart异步不同于java的线程,java线程是抢占式,但dart相当于开辟了一个新的进程的线程,不会对当前数据产生影响,也就没有所谓的锁 这是单线程的好处
Isolate机制 isolate一般不会在代码中直接使用
举个栗子:
image.png
import 'dart:isolate';
void main() {
ReceivePort port = ReceivePort();
Isolate.spawn(fun, port.sendPort);///固定写法
port.listen((t) {///这里是设置当前receivePort 监听
print("接收到其他isolate发过来的消息!");///这里接收了其他isolate发送的消息
print(t);///接收到的为fun方法里面发送的消息
});
}
void fun(SendPort sendPort) {
var receivePort = new ReceivePort();
var port = receivePort.sendPort;
port.send("a");///发送消息
sendPort.send("---");///发送消息
receivePort.listen((t) {///这里是设置当前receivePort 监听
print("接收到当前isolate发过来的消息!");///这里接收了当前发送的消息
print(t);
});
}
Isolate并行
Isolate相互之间不是会干扰的
image.png
image.png
import 'dart:isolate';
void main() {
Isolate.spawn(i1, "");
Isolate.spawn(i2, "");
}
void i1( msg) {
print("isolate1 执行");
Future.doWhile((){///Future代表未来要做的事情
print("isolate1 future");
return true;
});
}
void i2( msg) {
print("isolate2 执行");
Future.doWhile((){///Future代表未来要做的事情
print("isolate2 future");
return true;
});
}
Future
举个文件读取的栗子:
image.png
import 'dart:io';
void main() {
new File(r"C:\Users\hp\Desktop\test.txt") ///在前面使用r 就可以不适用转义符号
.readAsString()
.then((t) {///then表示接下来要做的事情
print(t);
return "你好";///这里可以返回值 继续传给下一个then方法来使用
}).then((t) {///这里继续使用then方法
print(t);
});
}
async await
async await 一般都是配合使用 他会阻塞 使其一步一步执行
继续举个文件读取的栗子:
image.png
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();///这个执行完才能往下执行
String s2 = await new File(r"C:\Users\hp\Desktop\test1.txt").readAsString();
return "$s1\n$s2";
}
stream订阅模式
image.png
只能单个订阅,多个的话会报错
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("订阅");
});
}
但是将他变成广播模式可以进行多订阅:
var broadcastStream = stream.asBroadcastStream();
broadcastStream.listen((_){
print("订阅");
});
broadcastStream.listen((_){
print("订阅");
});
广播订阅
由单订阅转换而来的 : 和单订阅唯一的区别就是 允许多订阅
var stream = Stream.fromIterable([1,2,3,4]);
var broadcastStream = stream.asBroadcastStream();
broadcastStream.listen((i){
print("订阅者1:${i}");
});
broadcastStream.listen((i){
print("订阅者2:${i}");
});
需要注意的地方:直接创建广播,发送一条消息是不能接收到的
import 'dart:async';
void main(){
var streamController = StreamController.broadcast();
streamController.add("1");
streamController.stream.listen((i){
print("广播:"+i);
});
streamController.close();
}
记得关闭