Hello, Android!
코루틴 launch, async 본문
프로세스나 스레드는 진행중인 작업을 중단하고
다른 작업을 실행하기 위한 문맥교환이 발생할때 많은 비용이 발생한다
하지만 코루틴은 문맥교환 없이 일시중단하여 비용이 적게 발생하는 장점이 있다
- 라이브러리 추가
코루틴을 사용하기 위해서는 라이브러리를 추가해야한다
인텔리J 에서 라이브러리를 추가하기 위해서는
File -> Project Structure -> Libraries에서 + 버튼을 눌러 From Maven
에서 Kotlinx 를 검색하여 org.jetbrains.kotlinx:kotlinx-coroutines-core:버전
을 선택하여 라이브러리를 다운받으면 된다
- launch
launch를 통해 코루틴 블록을 만드는 것을 코루틴 빌더 생성 이라고 한다
launch는 현재 스레드를 차단하지 않고 새로운 코루틴을 실행할수 있으며
특정 결괏값 없이 Job객체를 반환한다
위 코드를 실행하게 되면
call in main 이 바로 출력되며 잠시 뒤 job.isActive: true, Completed: false 이 출력되며
1초 뒤 coroutine launch 5초 뒤 job.isActive: false, Completed: true 이 출력된다
이는 main함수는 메인 스레드에서 실행이 되며
launch내부의 코드는 코루틴 코드로 메인 스레드와는 별도로 실행이 된다
그리고 이는 메인 스레드와는 별도로 실행되므로 넌블로킹 코드이다
또한 위와같이 launch를 통해 코루틴 블록을 만드는 것을 코루틴 빌더의 생성 이라고 한다
launch는 현재 스레드를 차단하지 않고 새로운 코루틴을 생성하며, 특정 결과는 없고 Job객체를 반환한다
GlobalScope.launch에서 알수있듯이 launch의 범위를 결정하는 GlobalScope가 지정되어있다
당연한 말이지만 프로그램이 종료되면 코루틴도 종료된다
즉 main함수가 종료되면 코루틴도 종료된다
만약 코루틴 내에서 어떠한 함수를 호출하기 위해서는
suspend로 선언된 함수들만 코루틴 내에서 호출이 가능하다
suspend함수는 일시중단이 가능하며, 다시 재개가 가능하다
앞서 launch에서 사용한 delat함수가 있는 Delay클래스를 살펴보면
delay함수 또한 suspend로 선언되어있다
이번에는 printFriends 함수 내에서 launch로 코루틴을 실행하며
suspend로 정의된 함수 두개를 호출하는데, 두 함수는 delay 시간이 서로 다르다
코루틴이 실행되기 전에 main함수가 종료되는것을 막기 위해
readLine함수로 엔터를 입력받기 전까지 기다리게 된다
- async
async또한 launch와 같이 코루틴 빌더를 생성한다
launch와 다른점은 Deferred<T>를 통해 결과를 반환한다
printFriends함수의 launch내부의 두 println함수를 보면
async결과에 await을 사용하였는데
await은 해당 코루틴의 작업이 끝나는 시점을 기다렸다 결과를 받아올수 있다
위의 예제는 printRyan에 딜레이 1초, printFrodo가 딜레이 3초이기때문에
어느쪽이 먼저 종료될지 알수있지만, 많은 태스크들이 병행되는 경우
어떤 루틴이 먼저 종료될지 알수없기때문에
태스크가 종료되는 시점을 기다렸다 결과를 받을수 있도록 await을 활용한다
'Kotlin' 카테고리의 다른 글
코루틴의 문맥 (0) | 2020.09.12 |
---|---|
runBlocking (0) | 2020.09.06 |
스레드 (0) | 2020.08.29 |
I/O 입출력 (입력) (0) | 2020.08.16 |
I/O 입출력 (출력) (0) | 2020.08.15 |