- 중단 함수는 컨티뉴에이션 객체를 다른 중단 함수로 전달해야 함.
- 따라서 중단 함수가 일반 함수를 호출하는 것은 가능하지만, 일반 함수가 주단 함수를 호출하는 것은 불가능함.
- 모든 중단 함수는 또 다른 중단 함수에 의해 호출되어야 함.
kotlinx.coroutines
라이브러리가 제공하는 세 가지 필수적은 코루틴 빌더는 다음과 같음.
launch 빌더
- 작동하는 방식은 thread 함수를 호출하여 새로운 스레드를 시작하는 것과 비슷함.
- CoroutineScope 인터페이스의 확장 함수임.
- 이는 부모 코루틴과 자식 코루틴 사이의 관계를 정립하기 위한 목적으로 사용되는
구조화된 동시성
의 핵심임.
- 작동하는 방식은 데몬 스레드와 어느 정도 비슷하지만 훨씬 가벼움.
- 데몬 스레드란 백그라운드에서 돌아가며, 우선순위가 낮은 스레드임.
runBlocking 빌더
- 코루틴이 스레드를 블로킹하지 않고 작업을 중단시키기만 하는 것은 일반적인 법칙임.
- 블로킹이 필요한 경우도 있기 때문에, 이런 경우
runBlocking
을 사용하면됨.
- 이는 코루틴이 중단되었을 경우 시작한 스레드를 중단시킴.
- 이는 사용되는 특수한 경우가 두 가지 있음.
- 프로그램이 끝나는 걸 방지하기 위해 스레드를 블로킹할 필요가 있는 메인 함수
- 같은 이유로 스레드를 블로킹할 필요가 있는 유닛 테스트
async 빌더
launch
와 비슷하지만 값을 생성하도록 설계되어 있음.
Deferred<T>
타입의 객체를 리턴하며, T
는 생성되는 값의 타입임.
Deferred
에는 작업이 끝나면 값을 반환하는 중단 메서드인 await
이 있음.
- 반환된
Defeered
는 값이 생성되면 해당 값을 내부에 저장하기 때문에 await
에서 값이 반환되는 즉시 값을 사용할 수 있음.
- 값이 생성되기 전에
await
을 호출하면 값이 나올 때까지 기다리게 됨.
launch
빌더와 비슷하게 이는 호출되자마자 코루틴을 즉시 시작함.
- 몇 개의 작업을 한번에 시작하고 모든 결과를 한 번에 기다릴 때 사용됨.
- 값이 필요하지 않을 땐
launch
를 사용.
- 두 가지 다른 곳에서 데이터를 얻어와 합치는 경우처럼 두 작업을 병렬로 실행할 때 주로 사용됨.
구조화된 동시성