简介
Dart 提供了 isolate, isolate与线程类似,isolate与线程的区别是 :线程与线程之间是共享内存的,而isolate与isolate之间是不共享内存的。
async/await Future 也可实现异步操作,这种异步其实是运行在同一线程中并没有开启新的线程, 只是通过单线程的任务调度实现一个先执行其他的代码片段,等这边有结果后再返回的异步效果。
关键字
Isolate
ReceivePort
SendPort
StreamSubscription
Isolate.spawn
Isolate.spawnUri
StreamSubscription.cancel
Isolate.kill
演示代码
import 'dart:async';
import 'dart:isolate';
void main(List<String> arguments) {
isolateTest();
}
//异步调度
void doWork(List list) {
SendPort sendPort = list[0];
print('--------------异步调度开始');
ReceivePort receivePort = ReceivePort();
SendPort sp = receivePort.sendPort;
//传递给主线 发送对象,达到双向通信
sendPort.send(sp);
//监听对象
StreamSubscription streamSubscription;
streamSubscription = receivePort.listen((message) {
print('--------------异步接收到消息 $message');
if (message == -1) {
print('--------------异步接收到-1 结束通信');
streamSubscription?.cancel();
return;
}
sendPort.send(message + 1);
});
}
///Isolate调度测试
void isolateTest() async {
//接收
ReceivePort receivePort = ReceivePort();
//发送
SendPort sendPort = receivePort.sendPort;
//调用异步
Isolate isolate = await Isolate.spawn(doWork, [sendPort, '传递参数']);
//异步发送对象
SendPort workSendProt;
//监听对象
StreamSubscription streamSubscription;
streamSubscription = receivePort.listen((message) {
if (message is SendPort) {
workSendProt = message;
print('接收到异步发来的 sendProt');
//开始通信
workSendProt.send(1);
return;
}
print('异步调度发来消息: $message');
if (message >= 20) {
//结束通信
print('发起结束通信');
workSendProt.send(-1);
streamSubscription?.cancel();
isolate.kill();
return;
}
workSendProt.send(message + 1);
});
}
运行结果
--------------异步调度开始
接收到异步发来的 sendProt
--------------异步接收到消息 1
异步调度发来消息: 2
--------------异步接收到消息 3
异步调度发来消息: 4
--------------异步接收到消息 5
异步调度发来消息: 6
--------------异步接收到消息 7
异步调度发来消息: 8
--------------异步接收到消息 9
异步调度发来消息: 10
--------------异步接收到消息 11
异步调度发来消息: 12
--------------异步接收到消息 13
异步调度发来消息: 14
--------------异步接收到消息 15
异步调度发来消息: 16
--------------异步接收到消息 17
异步调度发来消息: 18
--------------异步接收到消息 19
异步调度发来消息: 20
发起结束通信
--------------异步接收到消息 -1
--------------异步接收到-1 结束通信
Process finished with exit code 0
网友评论