본문 바로가기

컴퓨터 언어/Kotlin

05. 코루틴의 runBlocking

runBlocking은 자신이 호출 되는 스레드를 정지하고 새로운 코루틴을 만들어 실행한다.

때문에 UI에서 실행할 경우, UI 스레드를 정지하여 ANRS(Application Not Responding) 에러가 발생할 수 있다.

2022.09.03 추가) 또한, runBlocking은 내부에 코루틴이 모두 종료될 때까지 계속 스레드를 정지합니다.

 

runBlocking은 주로 어디에 사용되나? 
1. suspend 함수를 부르고 싶은데 딱히 코루틴 작업(동시성)이 필요 없을 때.
2. junit으로 테스트할 때, test함수에서 suspend 함수를 실행하기 위해
3. 프로그램에 흐름을 보고 싶을 때.

 

여러 블로그를 찾아 보면서 느낀 건데 runBlocking과 GlobalScope는 웬만하면 사용하지 말라는 글들이 많다.

진짜 잘 사용할 자신이 있는 게 아니면 사용하지 말자.

 

[UI 스레드를 1초간 막는 경우]

package com.goodee.test

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.databinding.DataBindingUtil
import com.goodee.test.databinding.ActivityMainBinding
import kotlinx.coroutines.*

class MainActivity : AppCompatActivity() {
    private val TAG: String = "로그"
    private lateinit var binding: ActivityMainBinding
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        binding.nextBtn.setOnClickListener {
            Log.d(TAG,"MainActivity - Before :  run blocking ${Thread.currentThread().name}")
            // UI 스레드에서 시작되었으므로, UI 스레드를 정지한다.
            runBlocking {
                Log.d(TAG,"MainActivity - run Blocking Start ${Thread.currentThread().name}")
                delay(1000)
                Log.d(TAG,"MainActivity - run Blocking End ${Thread.currentThread().name}")
            }
            Log.d(TAG,"MainActivity - After : run Blocking ${Thread.currentThread().name}")
        }
    }
}

[출력]

D/로그: MainActivity - Before :  run blocking main
D/로그: MainActivity - run Blocking Start main
D/로그: MainActivity - run Blocking End main
D/로그: MainActivity - After : run Blocking main
I/Choreographer: Skipped 59 frames!  The application may be doing too much work on its main thread.

 

runBlocking은 UI 스레드를 정지하고, runBlocking을 종료한 후에 남은 UI 작업을 하는 것을 볼 수 있다.

또한 메인스레드가 정지한 것을 인식하자, 로그에서 메시지(I/Choreographer)를 뛰우는 것을 볼 수 있다.

 

[참고한 블로그]

https://thdev.tech/kotlin/2020/12/15/kotlin_effective_15/

 

Kotlin Coroutines의 runBlocking은 언제 써야 할까? 잘 알고 활용하자! |

I’m an Android Developer.

thdev.tech

 

728x90
반응형

'컴퓨터 언어 > Kotlin' 카테고리의 다른 글

07. 코루틴의 Async and Await  (0) 2022.07.06
06. 코루틴의 Job, waiting, Cancelation  (0) 2022.07.05
04. 코루틴의 Context  (0) 2022.07.05
03. 코루틴 suspend 함수  (0) 2022.07.05
02. 코루틴 첫 시작  (0) 2022.07.04