void multiThread() async{
print('current thread is ${Isolate.current.debugName}');
var r1 = ReceivePort();
var p1 = r1.sendPort;
Isolate.spawn(chileThread, p1);
SendPort p2 = await r1.first;
var msg = await sendToReceive(p2, '发送给子线程的消息');
print(msg);
var msg1 = await sendToReceive(p2, '发送给子线程的消息1');
print(msg1);
}
void chileThread(SendPort p1) async{
print('current thread is ${Isolate.current.debugName}');
ReceivePort r2 = ReceivePort();
SendPort p2 = r2.sendPort;
p1.send(p2);
//await for也可以用listen替换
await for(var msg in r2){
var data = msg[0];
print(data);
SendPort replyPort = msg[1];
replyPort.send('发送给主线程的消息');
}
/*
r2.listen((msg){
var data = msg[0];
print(data);
SendPort replyPort = msg[1];
replyPort.send('发送给主线程的消息');
});
*/
}
//为消息发送专门创建一对ReceivePort+SendPort
Future sendToReceive(SendPort port, msg){
ReceivePort response = ReceivePort();
port.send([msg, response.sendPort]);
return response.first;
}
void main() async {
multiThread();
}
说明:
Stream
在 Dart API 中 Stream 对象随处可见,Stream 用来表示一系列数据。例如,HTM中的按钮点击就是通过 stream 传递的。同样也可以将文件作为数据流来读取。
如果想从 Stream 中获取值,可以有两种选择:
使用 async 关键字和一个 异步循环(使用 await for 关键字标识)。
使用 Stream API。详情参考库概览。
await for
使用 await for 定义异步循环看起来是这样的:
await for (varOrType identifier in expression) {
// 每当 Stream 发出一个值时会执行
}
expression的类型必须是 Stream。执行流程如下:
1. 等待直到 Stream 返回一个数据。
2. 使用 1 中 Stream 返回的数据执行循环体。
3. 重复 1、2 过程直到 Stream close。
使用 break 和 return 语句可以停止接收 Stream 数据,这样就跳出了循环并取消注册监听 Stream。
|