Yield

2024. 11. 27. 15:54Kotlin

코틀린(Kotlin)에서 yield는 코루틴의 실행을 일시 중단하고, 다른 코루틴이나 작업이 실행될 기회를 주는 함수입니다. yield는 협력적 멀티태스킹을 구현하는 데 사용됩니다. 이는 코루틴이 자신의 실행을 중단하고 다른 코루틴이 실행될 수 있도록 함으로써, 공정한 스케줄링을 가능하게 합니다.

yield의 기본 사용법

yieldsuspend 함수로, 코루틴 내에서만 호출될 수 있습니다. 다음은 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