본문 바로가기

코루틴

[코루틴] 무제한 디스패처 (Unconfined Dispatcher)

 

무제한 디스패처 (Unconfined Dispatcher)

코루틴을 실행시킨 스레드에서 즉시 실행하도록 만드는 디스패처

호출된 스레드가 무엇인지 상관없어 실행 스레드가 제한되지 않아 무제한 디스패처

fun main() = runBlocking<Unit> {
    launch(Dispatchers.Unconfined) {
        println("launch 실행 스레드 : ${Thread.currentThread().name}")
    }
}
// 결과
launch 실행 스레드 : main

 

 

특징

코루틴을 생성한 스레드에서 즉시 실행

fun main() = runBlocking<Unit>(Dispatchers.IO) {
    println("runBlocking 실행 스레드 : ${Thread.currentThread().name}")
    launch(Dispatchers.Unconfined) {
        // 코루틴을 실행한 runBlocking의 스레드에서 실행
        println("launch1 실행 스레드 : ${Thread.currentThread().name}")
    }
    launch {
        println("launch2 실행 스레드 : ${Thread.currentThread().name}")
    }
}
// 결과
runBlocking 실행 스레드 : DefaultDispatcher-worker-1
launch1 실행 스레드 : DefaultDispatcher-worker-1
launch2 실행 스레드 : DefaultDispatcher-worker-3

 

 

 

중단 시점 이후의 재개는 코루틴을 재개하는 스레드

일시 중단 전까지만 코루틴을 생성한 스레드에서 즉시 실행

일시 중단 후 재시작할 경우 재시작 시키는 스레드에서 실행

fun main() = runBlocking<Unit> {
    launch(Dispatchers.Unconfined) {
        println("일시 중단 전 실행 스레드 : ${Thread.currentThread().name}")
        delay(100L)
        println("일시 중단 후 실행 스레드 : ${Thread.currentThread().name}")
    }
}
// 결과
일시 중단 전 실행 스레드 : main
일시 중단 후 실행 스레드 : kotlinx.coroutines.DefaultExecutor

DefaultExecutor 
- delay 함수를 실행하는 스레드, 일시 중단을 종료하고 코루틴을 재개할 때 사용하는 스레드

 

 

주의할 점

어떤 스레드가 코루틴을 재개할 지 알 수 없어 비동기 작업 등이 불안정해 사용을 권장하지 않음

 

 

알아두면 좋을 점

CoroutineStart.UNDISPATCHED vs 무제한 디스패처
일시 중단 후 재개 시 사용하는 스레드 차이

UNDISPATCHED 사용
- 코루틴은 자신이 실행되는 CoroutineDispatcher를 사용해 재개

무제한 디스패처 사용
- 코루틴은 자신을 재개시킨 스레드를 사용해 재개

 

fun main() = runBlocking<Unit> {
    println("runBlocking 실행 스레드 : ${Thread.currentThread().name}")
    launch(start = CoroutineStart.UNDISPATCHED) {
        println("[CoroutineStart.UNDISPATCHED] 코루틴 시작 시 사용 스레드 : ${Thread.currentThread().name}")
        delay(100L)
        println("[CoroutineStart.UNDISPATCHED] 코루틴 재개 시 사용 스레드 : ${Thread.currentThread().name}")
    }.join()

    launch(Dispatchers.Unconfined) {
        println("[Dispatchers.Unconfined] 코루틴 시작 시 사용 스레드 : ${Thread.currentThread().name}")
        delay(100L)
        println("[Dispatchers.Unconfined] 코루틴 재개 시 사용 스레드 : ${Thread.currentThread().name}")
    }.join()
}
// 결과
runBlocking 실행 스레드 : main
[CoroutineStart.UNDISPATCHED] 코루틴 시작 시 사용 스레드 : main
[CoroutineStart.UNDISPATCHED] 코루틴 재개 시 사용 스레드 : main
[Dispatchers.Unconfined] 코루틴 시작 시 사용 스레드 : main
[Dispatchers.Unconfined] 코루틴 재개 시 사용 스레드 : kotlinx.coroutines.DefaultExecutor