중단함수 : 실행 중 취소 가능한 구간마다 취소 요청이 있었는지 확인하고 요청이 있었다면 실행을 즉시 취소하도록 구현
runBlocking {
val job = launch(Dispatchers.Default) {
for (i in 1..10) {
yield()
println("I'm sleeping $i ...")
Thread.sleep(500L)
}
}
delay(1300L)
println("main : I'm tired of waiting!")
job.cancelAndJoin()
println("main : Now I can quit.")
}
runBlocking {
val job = launch(Dispatchers.Default) {
for (i in 1..10) {
if (!isActive){
break
}
println("I'm sleeping $i ...")
Thread.sleep(500L)
}
}
delay(1300L)
println("main : I'm tired of waiting!")
job.cancelAndJoin()
println("main : Now I can quit.")
}
- 위 코드블록에서 취소요청 : job.cancelAndJoin()
- 위 코드블록에서 중단함수 : yield(), if(!isActive) break
- 중단함수들은 취소되면 CancellationException 을 발생
Dispatch
- JVM 에서 백그라운드 작업을 수행하기 위해 적용
- launch {}, async {} 등의 코루틴 빌더를 통해 코루틴을 생성 및 실행할 때, 코루틴이 속한 코루틴 스코프에 적용
- Default, IO, Main, Unconfined
- 코루틴을 실행할 때
- CPU 사용이 주를 이루는 작업은 Dispatchers.Default 를 사용
- Network, Disk I/O 가 주를 이루는 작업은 Dispatchers.IO 를 사용
withContext : 스레드 전환을 안전하게 하기 위해서 사용
runBlocking {
val job = launch {
try {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
} finally {
withContext(NonCancellable) {
delay(1000)
println("main : I'm running finally!")
}
}
}
delay(1300L)
println("main : I'm tired of waiting!")
job.cancelAndJoin()
println("main : Now I can quit.")
}
- withContext 없이 delay() 중단함수를 호출할 경우 현재 코루틴 컨텍스트는 이미 취소된 상태라서 또 다른 중단 함수를 호출할 수 없음
- NonCancellable : 작업이 취소되지 않도록 보장하는 특별한 컨텍스트
suspend fun getUser(): User {
return withContext(Dispatchers.IO) {
api.fetchUser()
}
}
- Dispatchers.IO : 명시적으로 IO 스레드에서 실행됨을 보장
withTimeout : 제한 시간을 설정 할 대상이 되는 코루틴을 생성
runBlocking {
withTimeout(1300L) {
launch {
try {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
} finally {
println("main : I'm running finally!")
}
}
}
}
- 1.3초 후 TimeoutCancellationException 이 발생
https://myungpyo.medium.com/reading-coroutine-official-guide-thoroughly-part-0-20176d431e9d
Reading Coroutine official guide thoroughly — Part 0
요즘 안드로이드 앱 개발자들은 주개발 언어가 Java 에서 Kotlin 으로 많이 전환 되고 있다고 생각합니다. iOS 가 objective-c 에서 swift 로 전환할 때 처럼 안드로이드 SDK 공식 가이드에서도 Kotlin 과 Java
myungpyo.medium.com
'Language' 카테고리의 다른 글
[Kotlin] - Channels (0) | 2025.02.09 |
---|---|
[Kotlin] - 기본 문법 정리 (1) | 2025.02.02 |
[Kotlin] 제네릭 generic타입 (0) | 2025.02.02 |
[Kotlin] 코루틴 (1) - Basic (1) | 2025.02.01 |