코루틴5 코루틴 - 코루틴 스레드 양보와 실행 스레드 스레드 양보란?코루틴이 스레드를 양보한다는 것은 어떤 뜻일까?코루틴에서 대표적으로 아래의 함수들이 스레드를 양보하는 중단함수이다.delayyieldjoinawait아래 코드를 통해 살펴보자.suspend fun main() = runBlocking { val start = System.currentTimeMillis() repeat(3) { launch { delay(1000) println("elapsed time: ${System.currentTimeMillis() - start}") } }}>> elapsed time: 1012>> elapsed time: 1021>> elapsed time: 1021위 코드는 코루틴 .. 2024. 9. 17. 코루틴 - 중단함수 중단함수중단함수란?중단 함수란 코루틴을 중단할 수 있는 중단점을 제공하는 함수를 말한다.suspend fun 을 통해서 구현할 수 있다.기본적으로 일반 함수와 크게 다르지 않으나, 내부에 중단지점을 가질 수 있다는 것이 일반함수와의 차이다.일반적인 함수나 메서드(루틴과 서브루틴)코루틴중단함수는 코루틴이 아니다.코루틴을 처음 접하는 경우 중단함수가 코루틴이라고 착각할 수 있다.중단함수는 코루틴이 아니고, 코루틴 내에서 실행될 수 있는 함수이다.중단함수의 사용중단함수는 코루틴을 중단할 수 있는 함수이다. 그렇기 때문에 일반함수처럼 사용할 수 없다.중단함수를 호출할 수 있는 곳은 아래와 같다.코루틴 스코프다른 중단함수fun main() { myMethod() // 호출 불가능}suspend fun myMeth.. 2024. 9. 17. 코루틴 - 구조화된 동시성 구조화된 동시성구조화된 동시성이란?코루틴은 기본적으로 특정 코루틴 스코프 내에서 여러 코루틴이 협력하여 동작한다.코루틴은 부모-자식 관계를 가지며, 이 부모 자식 관계가 구조화 된다. 이를 구조화된 동시성이라고 한다.여기서 부모 코루틴이라 함은, 코루틴을 생성한 코루틴이라고 할 수 있다.runBlocking 과 같은 코루틴은 스스로 코루틴 스코프를 만들어서 실행하므로, 본인이 루트 코루틴이 된다. 왜 코루틴은 이런 구조화된 동시성을 필요로 할까?그것은 바로 코루틴을 효과적으로 제어하기 위함이다.구조화된 동시성의 특징을 살펴보자.부모의 실행환경을 상속받는다.부모 코루틴의 취소는 자식에게 전파된다.부모 코루틴은 자식 코루틴이 끝날때까지 기다린다.아래에서 각 특징들에 대해 각각 살펴보도록 하자.부모의 실행환경.. 2024. 9. 17. 코루틴 - 코루틴 빌더와 Job 코루틴 상태와 JobJob모든 코루틴 빌더는 Job 객체를 생성하고 반환한다.Job 객체는 코루틴 실행을 추상화한 객체로, Job 을 통해 코루틴의 상태를 추적 및 실행을 제어할 수 있다.코루틴 상태코루틴의 상태에 대해 한번 알아보자.코루틴은 아래와 같은 상태를 가질 수 있다.New : 코루틴 빌더를 통해 코루틴을 생성하면 New 상태가 되며, 지연 실행 옵션을 주지 않으면, active 상태로 전이된다.active: 실행중 상태로, 실제 코루틴을 실행하거나 중단된 상태를 포함한다.completing: 자신의 코루틴이 모두 완료되었으나, 자식 코루틴이 완료되기를 기다리는 상태이다.completed: 자신과 자식 코루틴 모두가 완료된 상태이다.cancelling : 코루틴이 취소요청을 받으면 취소중 상태가.. 2024. 9. 17. 코루틴 - CoroutineDispatcher CoroutineDispatcher란?코루틴은 근본적으로 스레드에 의해서 실행된다.그렇다면, 코루틴이 어떤 스레드에 의해서 실행되는지 결정하는 것은 무엇일까?이것을 결정하는 것이 바로 CoroutineDispatcher 이다.CoroutineDispatcher 는 Coroutine 이라는 작업 단위가 어떻게 실행될지 제어하는 객체이다.물론 CoroutineDispatcher 마다 내부 구현은 캡슐화 되어있기에 구현체마다 사용하는 기술이 다를 수 있으나,아래의 메서드를 통해 생성되는 CoroutineDispatcher 는 내부적으로 Executor 프레임워크의 ThreadPoolExecutor 를 사용하고 있다.*newFixedThreadPoolContext*()*newSingleThreadContext*.. 2024. 9. 17. 이전 1 다음