무제한 디스패처 (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
'코루틴' 카테고리의 다른 글
[코루틴] Channel (채널) (0) | 2024.11.18 |
---|---|
[코루틴] 코루틴의 동작 방식 (0) | 2024.09.29 |
[코루틴] CoroutineStart (0) | 2024.09.29 |
[코루틴] 공유 상태를 사용하는 코루틴 (1) | 2024.09.22 |
[코루틴] 코루틴의 스레드 동작 (0) | 2024.09.21 |