Flutter学习-22- Dart中的多线程
1. Isolate
先看一个例子
void IsolateTest(){
print('A');
Future(()=>print('B'));
sleep(Duration(seconds: 1));
print('C');
}
按照我们iOS中的想法主线程堵塞
,异步子线程
会执行从而打印ABC,但是在Future中是单线程
,就一个线程异步只是加入了任务队列,主线程堵塞,队列的任务也不会执行,所以最后是ACB
。
void IsolateTest(){
print('A');
Isolate.spawn(func,10);
sleep(Duration(seconds: 1));
print('C');
}
func(int num)=>print('B');
我们使用Isolate
进行异步操作,并传入一个值,打印结果是ABC
,是我们想要的结果
我们在来验证下我们理解的多线程
void IsolateTest(){
print('A');
Isolate.spawn(func,10);
Isolate.spawn(func2,10);
Isolate.spawn(func,10);
Isolate.spawn(func2,10);
Isolate.spawn(func,10);
Isolate.spawn(func2,10);
Isolate.spawn(func,10);
Isolate.spawn(func2,10);
sleep(Duration(seconds: 3));
print('C');
}
func(int num)=>print('B1');
func2(int num)=>print('B2');
按照我们之前的理解,应该是A之后是B1B2B1B2这样的添加顺序
,实际打印的是随机的,不是同步的
。
这就类似我们iOS中的
子线程
了,但是实际上并不是完全一样,我们在外部定义一个变量,之后Isolate线程
中改变它的值,之后主线程再打印。
void IsolateTest(){
print('A');
Isolate.spawn(func,10);
sleep(Duration(seconds: 3));
print('a= $a');
print('C');
}
int a = 1;
func(int num) {
a =num;
print('a= $a');
}
Isolate
更像一个进程
,意味着它有单独的内存空间
,不会抢夺资源
,所以我们就不需要加锁
处理。但是我们想要改变值的话该怎么做呢,继续往下看
void IsolateTest(){
print('A');
//创建一个prot
ReceivePort port = ReceivePort();
Isolate.spawn(func,port.sendPort);//传递
port.listen((message) { //监听
a = message;
print(message);
});
// sleep(Duration(seconds: 1));
print('a= $a');
print('C');
}
int a = 1;
//方法使用SendPort接受
func(SendPort sendPort) {
sendPort.send(101);//发送消息
a = 101;
print('a= $a');
}
我们使用ReceivePort
来传递值,port.listen
来监听值的改变,我们主线程在做出对应的改变,我们使用完成后要手动的关闭
。
Future<void> IsolateTest() async {
print('A');
//创建一个prot
ReceivePort port = ReceivePort();
Isolate iso = await Isolate.spawn(func,port.sendPort);//传递
port.listen((message) { //监听
a = message;
print(message);
port.close();
iso.kill();
});
sleep(Duration(seconds: 3));
print('a= $a');
print('C');
}
我们使用await
拿到iso
之后接受到了关闭端口,之后杀掉线程iso.kill
2. compute
compute是Isolate的封装
,使用方法类似。
computeTest(){
print('A');
compute(func2,10);
sleep(Duration(seconds: 2));
print('C');
}
func2(int num){
print('子线程来了');
}
打印结果:
我们想要改变内部的值的话,我们使用
await
接收
int a = 1;
computeTest() async{
print('A');
a = await compute(func2,10);
sleep(Duration(seconds: 2));
print('C');
print('a = $a');
}
int func2(int num){
print('子线程来了');
return 100;
}
打印结果为:
我们在子线程内部改变变量,外部打印下没有改变,其本质和我们Isolate
一样。
另外compute
不需要我们手动关闭
。
转载自:https://juejin.cn/post/7032648508247441421