Future
- 다트에서 이벤트 루프에 등록되는 애들이 있습니다.
- 보통은 다 바로 시작이 되는데 이벤트 루프에 등록되는 애들은 특징이 main( )이 종료되야지 실행됩니다.
1. Network
2. I/O (file 읽기, 쓰기)
3. Future(약속)
기본적인 사용
void download(){
print("1번 다운 시작");
// 2번째 인자에 함수를 넣어서 무언가를 5초 뒤에 실행시킴
// 우선 등록만 실행해놓고 main( )을 종료 시킴
Future<String> value = Future.delayed(Duration(seconds: 3), () {
print("4번 이벤트 실행됨");
});
// sleep은 대기를 명령
// sleep(Duration(seconds: 3));
print("2번 다운 완료");
}
main() async {
print("3번 메인 종료");
}
Future await / async
// Future는 Future로 return해줘야함
Future<String> download(){
print("1번 다운 시작");
// 2번째 인자에 함수를 넣어서 무언가를 5초 뒤에 실행시킴
// 우선 등록만 실행해놓고 main( )을 종료 시킴
// Future는 빈박스입니다.
Future<String> value = Future.delayed(Duration(seconds: 3), () {
print("4번 이벤트 실행됨");
// 바로 value 값이 들어옴
return "사과";
});
// sleep은 대기를 명령
// sleep(Duration(seconds: 3));
print("2번 다운 완료");
return value;
}
main() async {
String value = await download(); // download는 빈박스 = await는 빈박스가 채워져야 실행됨
print(value);
print("3번 메인 종료");
}
Future then
// Future는 Future로 return해줘야함
Future<String> download(){
print("1번 다운 시작");
// 2번째 인자에 함수를 넣어서 무언가를 5초 뒤에 실행시킴
// 우선 등록만 실행해놓고 main( )을 종료 시킴
// Future는 빈박스입니다.
Future<String> value = Future.delayed(Duration(seconds: 3), () {
print("4번 이벤트 실행됨");
// 바로 value 값이 들어옴
return "사과";
});
// sleep은 대기를 명령
// sleep(Duration(seconds: 3));
print("2번 다운 완료");
return value;
}
main() {
// Future는 빈박스 = then은 빈박스가 채워져야 실행됨
download().then((value) {
// 빈박스가 채워져야 실행됨
print(value);
});
print("3번 메인 종료");
}
순서대로 그리기
void download(){
for(int i = 0; i < 5; i++){
sleep(Duration(seconds: 1));
print("download 함수 : ${i}");
}
}
main(){
download();
for(int i = 0; i < 5; i++){
sleep(Duration(seconds: 1));
print("main 함수 : ${i}");
}
}
main 먼저 그리기
void download(){
// main 함수를 먼저 실행하고 싶으면 download의 for문을
// 이벤트 루프(Future)에 등록시키면 됨
Future(() {
for(int i = 0; i < 5; i++){
sleep(Duration(seconds: 1));
print("download 함수 : ${i}");
}
});
}
main(){
download();
for(int i = 0; i < 5; i++){
sleep(Duration(seconds: 1));
print("main 함수 : ${i}");
}
}
Isolate
동시에 그리기
void download(var msg){
// main 함수를 먼저 실행하고 싶으면 download의 for문을
// 이벤트 루프에 등록시키면 됨
Future(() {
for(int i = 0; i < 5; i++){
sleep(Duration(seconds: 1));
print("download 함수 : ${i}");
}
});
}
main(){
// Isolate는 독립적인 스레드로 동시에 진행하고 싶을 때 사용
Isolate.spawn(download, "download 실행");
for(int i = 0; i < 5; i++){
sleep(Duration(seconds: 1));
print("main 함수 : ${i}");
}
}
Isolate의 특징
- Isolate는 다른 언어의 스레드와 똑같습니다.
- 다른점은 heap을 공유하지 않습니다.
- 독립적인 heap이 있음.
- 이벤트가 들어왔을 때 그거 때문에 오래 기다려야 함. Future 사용
- 동시에 실행할 때 isolate 사용
void change(var value){
num = value;
print("change : ${num}");
}
void check(var value){
print("check : ${num}");
}
void main(){
Isolate.spawn(change, 20);
Isolate.spawn(check, num);
}