2024. 11. 27. 15:54ㆍKotlin
코틀린(Kotlin)에서 yield
는 코루틴의 실행을 일시 중단하고, 다른 코루틴이나 작업이 실행될 기회를 주는 함수입니다. yield
는 협력적 멀티태스킹을 구현하는 데 사용됩니다. 이는 코루틴이 자신의 실행을 중단하고 다른 코루틴이 실행될 수 있도록 함으로써, 공정한 스케줄링을 가능하게 합니다.
yield의 기본 사용법
yield
는 suspend
함수로, 코루틴 내에서만 호출될 수 있습니다. 다음은 yield
를 사용하는 간단한 예제입니다:
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
repeat(5) {
println("Coroutine A - $it")
yield() // Yield execution to other coroutines
}
}
launch {
repeat(5) {
println("Coroutine B - $it")
yield() // Yield execution to other coroutines
}
}
}
위 예제에서 두 코루틴이 yield
를 사용하여 실행을 서로 번갈아 가며 수행합니다. yield
는 현재 코루틴의 실행을 일시 중단하고, 다른 코루틴이 실행될 기회를 줍니다.
yield와 협력적 멀티태스킹
yield
는 협력적 멀티태스킹을 구현하는 데 유용합니다. 협력적 멀티태스킹에서는 각 작업이 명시적으로 자신의 실행을 일시 중단하고, 다른 작업이 실행될 수 있도록 합니다. 이는 공정한 스케줄링을 가능하게 하며, 특정 코루틴이 CPU 시간을 독점하는 것을 방지합니다.
다음은 yield
를 사용하여 협력적 멀티태스킹을 구현하는 예제입니다:
import kotlinx.coroutines.*
fun main() = runBlocking {
val job1 = launch {
for (i in 1..5) {
println("Job 1 - $i")
yield() // Yield execution to other coroutines
}
}
val job2 = launch {
for (i in 1..5) {
println("Job 2 - $i")
yield() // Yield execution to other coroutines
}
}
joinAll(job1, job2) // Wait for both jobs to complete
}
위 예제에서 두 개의 코루틴이 yield
를 사용하여 번갈아 가며 실행됩니다. 각 코루틴은 자신의 실행을 일시 중단하고, 다른 코루틴이 실행될 수 있도록 합니다.
yield와 Dispatchers
yield
는 특정 디스패처와 함께 사용될 때 더욱 유용할 수 있습니다. 예를 들어, Dispatchers.Default
와 함께 사용하면 CPU 집약적인 작업을 공정하게 분배할 수 있습니다:
import kotlinx.coroutines.*
fun main() = runBlocking {
val job1 = launch(Dispatchers.Default) {
for (i in 1..5) {
println("Job 1 - $i on ${Thread.currentThread().name}")
yield() // Yield execution to other coroutines
}
}
val job2 = launch(Dispatchers.Default) {
for (i in 1..5) {
println("Job 2 - $i on ${Thread.currentThread().name}")
yield() // Yield execution to other coroutines
}
}
joinAll(job1, job2) // Wait for both jobs to complete
}
위 예제에서 두 개의 코루틴이 Dispatchers.Default
에서 실행되며, yield
를 사용하여 공정하게 CPU 시간을 분배합니다.
'Kotlin' 카테고리의 다른 글
withContext (0) | 2024.11.27 |
---|---|
runBlocking (0) | 2024.11.27 |
Launch (0) | 2024.11.27 |
Async (0) | 2024.11.27 |
Dispatchers (0) | 2024.11.27 |