안드로이드 코루틴

James_·2022년 3월 5일
0

코루틴

목록 보기
1/4

코루틴 빌더

runBlocking

코드 블록이 수행될때까지 다른 작업을 수행하지 않고 실행함
(안드로이드에서 사용하면 안 됨 ANR 야기)

코루틴 컨텍스트

코루틴 스코프는 코루틴을 제대로 처리하기 위한 정보, CorotuineContext를 가지고 있음

import kotlinx.coroutines.*

fun main() = runBlocking{
	println(this)
	println(coroutineContext)
}
// "coroutine#1":BlockingCoroutine{Active}@36d64342
[CoroutineId(1), "coroutine#1":BlockingCoroutine{Active}@36d64342, BlockingEventLoop@19dfb72a]

launch 코루틴 빌더

launch는 새로운 코루틴을 만들어서 코드를 수행하게하고 다른 코드를 함꼐 수행하게함.
가능하다면 다른 블록의 코루틴이 같이 실행됨

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        println("World!")
    }
    println("Hello")
}
// Hello
// World!

runBlocking이 실행되고 launch가 실행된다.
runBlocking이 메인스레드에서 실행되고 있기 때문에 lauch는 기다림.

delay 함수

많은 예제에서 확인할 수 있다.
해당스레드를 잠시 해제하고 쉬어가는 의미로 이해하면 좋을 것 같다.
다른 코루틴이 사용할 수 있게 양보함

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        println("launch: ${Thread.currentThread().name}")
        println("World!")
    }
    println("runBlocking: ${Thread.currentThread().name}")
    delay(500L)
    println("Hello")
}
runBlocking: main @coroutine#1
launch: main @coroutine#2
World!
Hello

runBlocking이 먼저 호출되었지만 delay이되어 launch에게 양보하는 것을 확인할 수 있다.

sleep 함수

delay와 같다고 생각할 수 있지만 다르다

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        println("launch: ${Thread.currentThread().name}")
        println("World!")
    }
    println("runBlocking: ${Thread.currentThread().name}")
    Thread.sleep(500)
    println("Hello")
}
runBlocking: main @coroutine#1
Hello
launch: main @coroutine#2
World!

Thread.sleep()은 아무 일을 하지 않는 동안에도 스레드를 양보하지 않고 독점하기 때문에 delay랑 다른 동작을 하는 것을 확인할 수 있다.

한 곳에 여러 launch

iimport kotlinx.coroutines.*

fun main() = runBlocking {
    launch {
        println("launch1: ${Thread.currentThread().name}")
        delay(1000L)
        println("3!")
    }
    launch {
        println("launch2: ${Thread.currentThread().name}")
        println("1!")
    }
    println("runBlocking: ${Thread.currentThread().name}")
    delay(500L)
    println("2!")
}
runBlocking: main @coroutine#1
launch1: main @coroutine#2
launch2: main @coroutine#3
1!
2!
3!

delay를 모두 지우면 제일 바깥 runBlocking 블록의 2 -> 3 -> 1 출력된다.
delay를 주게 되면 숫자 그대로 1 -> 2 -> 3이 출력된다.

부모 코루틴은 자식 코루틴을 끝까지 책임진다

import kotlinx.coroutines.*

fun main() {
    runBlocking {
        launch {
            println("launch1: ${Thread.currentThread().name}")
            delay(1000L)
            println("3!")
        }
        launch {
            println("launch2: ${Thread.currentThread().name}")
            println("1!")
        }
        println("runBlocking: ${Thread.currentThread().name}")
        delay(500L)
        println("2!")
    }
    print("4!")
}
runBlocking: main @coroutine#1
launch1: main @coroutine#2
launch2: main @coroutine#3
1!
2!
3!
4!

runBlocking이 끝날때까지 4가 출력이 안 되는 것을 확인할 수 있다.

Suspend Function

delay,sleep과 같이 suspend 함수는 중단점(Suspension Point)가 되며 코루틴이 잠이 들 수 있고 다른 코루틴에 의해 깨어날 수 있다.

profile
Android 개발자

0개의 댓글