簡介
Dart 提供了 isolate, isolate與線程類似,isolate與線程的區(qū)別是 :線程與線程之間是共享內(nèi)存的窘面,而isolate與isolate之間是不共享內(nèi)存的。
async/await Future 也可實(shí)現(xiàn)異步操作,這種異步其實(shí)是運(yùn)行在同一線程中并沒有開啟新的線程, 只是通過單線程的任務(wù)調(diào)度實(shí)現(xiàn)一個先執(zhí)行其他的代碼片段财边,等這邊有結(jié)果后再返回的異步效果。
關(guān)鍵字
Isolate
ReceivePort
SendPort
StreamSubscription
Isolate.spawn
Isolate.spawnUri
StreamSubscription.cancel
Isolate.kill
演示代碼
import 'dart:async';
import 'dart:isolate';
void main(List<String> arguments) {
isolateTest();
}
//異步調(diào)度
void doWork(List list) {
SendPort sendPort = list[0];
print('--------------異步調(diào)度開始');
ReceivePort receivePort = ReceivePort();
SendPort sp = receivePort.sendPort;
//傳遞給主線 發(fā)送對象酣难,達(dá)到雙向通信
sendPort.send(sp);
//監(jiān)聽對象
StreamSubscription streamSubscription;
streamSubscription = receivePort.listen((message) {
print('--------------異步接收到消息 $message');
if (message == -1) {
print('--------------異步接收到-1 結(jié)束通信');
streamSubscription?.cancel();
return;
}
sendPort.send(message + 1);
});
}
///Isolate調(diào)度測試
void isolateTest() async {
//接收
ReceivePort receivePort = ReceivePort();
//發(fā)送
SendPort sendPort = receivePort.sendPort;
//調(diào)用異步
Isolate isolate = await Isolate.spawn(doWork, [sendPort, '傳遞參數(shù)']);
//異步發(fā)送對象
SendPort workSendProt;
//監(jiān)聽對象
StreamSubscription streamSubscription;
streamSubscription = receivePort.listen((message) {
if (message is SendPort) {
workSendProt = message;
print('接收到異步發(fā)來的 sendProt');
//開始通信
workSendProt.send(1);
return;
}
print('異步調(diào)度發(fā)來消息: $message');
if (message >= 20) {
//結(jié)束通信
print('發(fā)起結(jié)束通信');
workSendProt.send(-1);
streamSubscription?.cancel();
isolate.kill();
return;
}
workSendProt.send(message + 1);
});
}
運(yùn)行結(jié)果
--------------異步調(diào)度開始
接收到異步發(fā)來的 sendProt
--------------異步接收到消息 1
異步調(diào)度發(fā)來消息: 2
--------------異步接收到消息 3
異步調(diào)度發(fā)來消息: 4
--------------異步接收到消息 5
異步調(diào)度發(fā)來消息: 6
--------------異步接收到消息 7
異步調(diào)度發(fā)來消息: 8
--------------異步接收到消息 9
異步調(diào)度發(fā)來消息: 10
--------------異步接收到消息 11
異步調(diào)度發(fā)來消息: 12
--------------異步接收到消息 13
異步調(diào)度發(fā)來消息: 14
--------------異步接收到消息 15
異步調(diào)度發(fā)來消息: 16
--------------異步接收到消息 17
異步調(diào)度發(fā)來消息: 18
--------------異步接收到消息 19
異步調(diào)度發(fā)來消息: 20
發(fā)起結(jié)束通信
--------------異步接收到消息 -1
--------------異步接收到-1 結(jié)束通信
Process finished with exit code 0