💜 장점
- 경량
- 메모리 누수 감소
- 취소 등 다양한 기능
- 제트팩 라이브러리 적용
fun main(){
// Thread Pool 에서 Dispatcher 생성
val threadPoolDispatcher = newFixedThreadPoolContext(5, "Thread 1")
// 싱글 Thread에서 Dispatcher 생성
val singleThreadDispatcher = newSingleThreadContext("Thread 2")
}
- Dispatchers.Main
: Android Main(UI) Thread에서 Coroutine을 실행하는 Dispatcher
반드시 UI 와 상호작용하기 위해서만 사용- Dispatchers.IO
: File Input/Output , Network IO, Parser 작업에 최적화된 Dispatcher
- Dispatchers.Default
: CPU 사용량이 많은 작업에 사용
대규모 Sorting, Graphics Rendering 등- Dispatchers.Unconfined : 특수한 상황에서 코루틴을 실행 (사용을 권장하지 않음)
// 코루틴 사용
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.4")
🤍 Coroutine Builder
launch
: 결과값이 없는 코루틴.
Job 객체를 리턴. 코루틴 관리만.async
: 결과값이 있는 코루틴.
Defferred 로 감싸서 값 리턴.withContext()
: T 반환(결과값 T 를 그대로 반환하는 코루틴)runBlocking()
: T (코루틴 완료할 때 까지 스레드를 점유)actor()
: SendChannelproduce()
: ReceiveChannel
- start : 현 코루틴의 상태를 알아내어 동작 중 = true, 준비/종료 = false
- join : 현 코루틴이 종료되기를 기다림, async Deferred의 await 와 같은 역할.
- cancel : 현 코루틴을 즉시종료 (Thread의 interrupt 와 같은 역할).
- cancelAndJoin : 현 코루틴을 종료하고 대기.
- cancelChildren : 현 Coroutine Scope 내에 작성한 자식 코루틴들을 종료.
부모 코루틴은 종료되지 않음.
// 현재 Thread 를 블럭 시키고 종료될 때 까지 대기 (안드로이드에서 신중하게 사용)
runBlocking {
// 새로운 코루틴을 시작하고 Job 객체획득
val job: Job = launch {
delay(3000L)
println(1)
}
println(2)
job.join() // 자식 코루틴이 종료되기를 기다림
println(3) // 코루틴 종료 후 다시 시작
}
CoroutineScope(Dispatchers.Main).launch {
// async 로 Boolean 결과값 반환
val deferred: Deferred<Boolean> = async(Dispatchers.IO) {
val data = listOf(1,2,3,4,5)
if (data.contains(2)) {
true
} else false
}
// async 작업이 완료 되고 난 후 호출.
val result = deferred.await()
println(result)
}
공식문서 : https://developer.android.com/kotlin/coroutines?hl=ko
https://kotlinlang.org/docs/coroutines-guide.html