Kotlin runBlocking: 코루틴 코드로 비코루틴 세계 연결

Kailash Vaviya 2023년6월20일
Kotlin runBlocking: 코루틴 코드로 비코루틴 세계 연결

Kotlin runBlocking() 함수는 main 스레드를 차단하는 일시 중단 함수입니다. 동기식 코드와 비동기식 코드 사이에 다리를 만드는 데 도움이 됩니다.

이 기사에서는 Kotlin runBlocking()과 다양한 시나리오에서의 용도에 대해 알아봅니다.

Kotlin의 runBlocking 기능

Kotlin의 delay() 함수에 대해 들어보셨을 것입니다. delay() 함수는 코루틴을 일시 중단하고 특정 시간 동안 지연시킵니다.

그러나 전체 스레드를 차단하지는 않습니다. 이는 delay() 함수를 사용할 때 UI 변경과 같은 다른 작업을 계속 수행할 수 있음을 의미합니다.

반면 runBlocking() 함수는 완료될 때까지 전체 스레드를 차단합니다. 따라서 컴파일러는 runBlocking() 코드가 있는 스레드가 완료될 때까지 다른 작업을 실행하지 않습니다.

Kotlin runBlocking() 함수에 의해 시작된 새 스레드는 main 스레드에서 시작됩니다.

이를 이해하기 위해 두 가지 예제 코드를 살펴보겠습니다. 첫 번째 코드에서는 GlobalScope.launch()delay() 함수를 사용합니다. 두 번째 예에서는 Kotlin runBlocking() 함수에서 사용합니다.

GlobalScope.launch()에서 delay()를 사용하십시오.

package com.example.mycoroutines

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    val TAG:String="This is Main Activity"
    override fun myFunc(savedInstanceState: Bundle?) {
        super.myFunc(savedInstanceState)
        setContentView(R.layout.activity_main)
        GlobalScope.launch(Dispatchers.Main) {
            delay(5000)
            Log.d(TAG,"Global Scope")
            Toast.makeText(applicationContext,"Thread executed in global scope",Toast.LENGTH_SHORT).show()
        }
        Log.d(TAG,"Not Global Scope")
        Toast.makeText(applicationContext,"Thread executed is not in Global Scope",Toast.LENGTH_SHORT).show()
    }
}

Android Studio에서 이러한 코드를 실행하면 "Not Global Scope" 태그가 실행됩니다. 그런 다음 "Global Scope" 태그 메시지가 5초 지연되어 실행됩니다.

이는 지연만 있을 뿐 작업은 계속 수행됨을 의미합니다. 따라서 스레드가 완전히 차단되지 않습니다.

Kotlin runBlocking()에서 delay() 사용

앞에서 보았듯이 GlobalScope.launch()에서 delay() 함수를 사용할 때 전체 스레드가 차단되지 않습니다.

하지만 Kotlin runBlocking에서 사용하면 runBlocking 코드의 모든 기능이 실행될 때까지 스레드가 차단됩니다. 다음은 같은 것을 보여주는 예입니다.

package com.example.mycoroutines

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Toast
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
    val TAG:String="This is Main Activity"
    override fun myFunc(savedInstanceState: Bundle?) {
        super.myFunc(savedInstanceState)
        setContentView(R.layout.activity_main)
        Log.d(TAG, "Prior using run blocking")
            runBlocking 
              {
              Log.d(TAG,"Entered run-blocking")
              delay(3000)

              Log.d(TAG,"Run-blocking started")
              Log.d(TAG,"Run-blocking ended")
            }
        Log.d(TAG,"Post using run blocking")
    }
}

이 코드를 사용하면 "Post using run blocking" 태그가 마지막으로 실행됩니다. 그 이유는 전체 runBlocking 코드가 실행될 때까지 모든 실행이 중지되기 때문입니다.

Kailash Vaviya avatar Kailash Vaviya avatar

Kailash Vaviya is a freelance writer who started writing in 2019 and has never stopped since then as he fell in love with it. He has a soft corner for technology and likes to read, learn, and write about it. His content is focused on providing information to help build a brand presence and gain engagement.

LinkedIn