Foggy day

Kotlin - coroutine Scope basic 본문

Kotlin

Kotlin - coroutine Scope basic

jinhan38 2021. 4. 10. 00:06
class KotlinPlayGroundActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_kotlin_play_ground)

        introduce()

        hungry.start()

        age()

        //GlobalScope.launch는 thread와 비슷한 기능
        // launch는 코루틴의 빌더이며 빌더를 사용하기 위해서는 scope가 필요하다
        // GlobalScope는 scope중의 하나
        //delay는 suspend 함수로 일시중단같은 개념, suspend 함수는 scope 안에서거나 백그라운드, 혹은 다른 suspend 함수에서만 가능
        GlobalScope.launch {
            delay(2000)
            println("world!")
        }

        //sleep은 thread를 블로킹한다
        thread {
            Thread.sleep(1000)
            println("new")
        }
        println("Hello!")
        Thread.sleep(2000)


        GlobalScope.launch {
            delay(1000)
            hungry.cancel()
        }

    }

    val hungry = GlobalScope.launch {
        repeat(100) {
            println("I'm hungry $it")
            delay(2500)
        }
    }

    fun introduce() = runBlocking {

        println("start introduce")

        val name = GlobalScope.launch {
            delay(3000)
            println("Jin Han")
        }
        val name2 = GlobalScope.launch {
            delay(6000)
            println("Jerome")
        }

        //scope함수들은 실행하면 일단 모두 실행된다.
        // 순서는 name2이 먼저이지만 delay 시간이 name2 = 6000, name =3000이기 때문에
        //name이 3초에 호출되고, 6초에 name2가 실행된다. 그리고 곧바로 My name is가 호출되고 함수 종료료        name2.join()  //
        name.join()   // Scope 함수에서 join을 호출하면 해당 함수가 완료될때까지 함수를 빠져나가지 않는다. 즉 여기서는 3초 delay
        println("My name is")

    }

    //structured concurrency
    // this.launch 로 실행한 scope들은 함수에 진입한 후 모두 동시에 실행된다.
    fun age() = runBlocking {

        //age 함수 진입 2초 후
        this.launch {
            delay(2000)
            println("26")
        }

        //age 함수 진입 5초 후
        this.launch {
            delay(5000)
            println("27")
        }

        //age 함수 진입 8초 후
        this.launch {
            age28()
        }

        println("My age is")

    }

    private suspend fun age28() {
        delay(8000)
        println("28")
    }

}


//  start introduce
//  I'm hungry 1
//  Jin Han
//  My name is
//  My age is
//  I'm hungry 2
//  26
//  Jerome
//  I'm hungry 3
//  27
//  I'm hungry 4
//  28
//  Hello!
//  new
//  I'm hungry 5
//  world!


 

'Kotlin' 카테고리의 다른 글

Kotlin - Coroutine concorrency example  (0) 2021.04.12
Kotlin - Coroutine cancel  (0) 2021.04.10
Kotlin - data class destructuring  (0) 2021.04.08
Kotlin - Object Expressions  (0) 2021.04.08
Kotlin - when, for  (0) 2021.04.06