sean.jin
Spark Code Blog
sean.jin
전체 방문자
오늘
어제
  • 분류 전체보기
    • 개발공부
      • Kotlin
      • LeetCode
      • Algorithm
      • React
    • 주식차트
    • 책리뷰
    • 유틸리티

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 쿼드러플위칭데이
  • 주식책리뷰
  • 오
  • 변동성
  • 경제
  • 네마녀의날
  • 트리플 위칭데이
  • 아빠와 딸의 주식투자 레슨
  • 초보
  • 책리뷰
  • 책추천
  • 주식입문자
  • 부의 추월차선
  • 주식투자
  • 책
  • 자기개발

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sean.jin

Spark Code Blog

개발공부/Kotlin

[Kotlin] 코루틴 Coroutine 사용법 - runBlocking 사용법 및 예제 - 2편

2021. 6. 12. 07:22
반응형

 

[Kotlin] 코루틴 Coroutine 사용법 및 개념 정리 - runBlocking - 2편

 

 

이전 포스트:[Kotlin] 코루틴 Coroutine 사용법 및 개념 정리 - GlobalScope, Delay, Dispatcher, Coroutine Context - 1편

 

[Kotlin] 코루틴 Coroutine 사용법 및 개념 정리 - GlobalScope, Delay, Dispatcher, Coroutine Context - 1편

[Kotlin] 코루틴 Coroutine 사용법 및 개념 정리 - GlobalScope, Delay, Dispatcher, Coroutine Context - 1편 Coroutine 개념 Coroutine은 다양한 테스크를 진행할 때 필요한 요소입니다. 스레드(T..

underdog11.tistory.com

runBlocking

  • 저번 포스트에서 GlobalScope안에 썼었던 delay는 main Thread를 멈추지 않는 걸 확인했습니다.
  • 그런데 mainThread를 멈출수있는 방법이 있습니다. 바로 runBlocking을 사용해주면 됩니다.
  • 그럼 runBlocking은 언제 쓸까요? onCreate에서 delay를 쓸 수 없습니다. 그런데 만약 onCreate에서 일어나는 UI 업데이트에 delay를 넣어주고 싶을 때 runBlocking안에 delay를 넣어 쓸 수 있습니다.
  • runBlocking은 다양하게 쓸 수 있습니다. 
class MainActivity : AppCompatActivity() {

    val TAG = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
		
        //a. GlobalScope 예시
        GlobalScope.launch(Dispatchers.Main){
         Log.d(TAG, "1a")
            delay(1000L)
            Log.d(TAG, "2a")
           
        }
         Log.d(TAG, "3a")
         
         
	//b. RunBlocking 예시
	runBlocking {
   		Log.d(TAG, "1b")
	delay(1000L) //여기서 delay를 실행시키면 UI업데이트를 모두 block 하게 됩니다.
   		Log.d(TAG, "2b")
        }
        Log.d(TAG, "3b")
    }
}
  • 위 코드를 실행시켜보면 a.Globalscope은 3a, 1a동시 (1초 후)-> 2a 순서로 로그가 찍히게 됩니다.
  • b. Runblocking에서는1b(1초 후) -> 2b->3b 순서로 로그가 찍히게 됩니다. 
  • 이렇게 RunBlocking의 역할은 sleep역할과 비슷한데 RunBlocking을 써야 하는 이유는 무엇일까요?

 

runBlocking을 써야하는 이유

  • 아래와 같이 runBlocking은 sleep과 똑같은 결과물을 가져옵니다. 
//using Thread.sleep
class MainActivity : AppCompatActivity() {

    val TAG = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        Log.d("TAG", "Before Sleep")
        Thread.sleep(2000L)
        Log.d("TAG", "End Sleep")
                
        }
}


//using runBlocking
class MainActivity : AppCompatActivity() {

    val TAG = "MainActivity"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        Log.d("TAG", "Before Sleep")
        runBlocking{
        	delay(1000L)
        }
        Log.d("TAG", "End Sleep")
                
        }
}
  • 결과가 같아도 runBlocking 쓰는 이유는 우선 runBlocking은 CoroutineScope 중 하나입니다. 그러므로 runBlocking안에서 다른 스레드를 실행할 수 있습니다. 
runBlocking {
            launch(Dispatchers.IO) { //launch를 실행할때 GlobalScope가 필요없습니다 왜냐하면
            //이미 runBlocking이 CoroutineScope이기 때문입니다.
                delay(3000L)
                Log.d("TAG","1a")
                
            }
            launch(Dispatchers.IO) { 
                delay(3000L)
                Log.d("TAG","1b")
            }
        }
  • 이렇게 코드를 실행하게 되면 runblocking이 실행되고 로그 1a와 1b가 동시에 실행되게 됩니다. 동시에 실행됐다는 것은 멀티 스레드가 작동했다는 것을 알 수 있습니다. 

참고자료

 

Coroutines basics | Kotlin

 

kotlinlang.org


다음포스트에서는 coroutine에서 자주쓰이는 Join, repeat,cancel을 다뤄보겠습니다.

 

[Kotlin] 코루틴 Coroutine 사용법 및 개념 정리 -Join, repeat - 3편

[Kotlin] 코 루틴 Coroutine 사용법 및 개념 정리 -Join, repeat, Cancel - 3편 전 포스트에서는 runblocking을 다뤄보았는데요 join, repeat을 쓰기 위해서 runBlocking을 아셔야 하기 때문에 모르신다면 보고 오..

underdog11.tistory.com

 

반응형

'개발공부 > Kotlin' 카테고리의 다른 글

[Kotlin] 코루틴 Coroutine - async와 await, LifecycleScope과 ViewModelScope 사용법 및 사용예제- 4편  (0) 2021.06.14
[Kotlin] 코루틴 Coroutine 제어하기 -Join, repeat,cancel,withTimeout - 3편  (0) 2021.06.12
[Kotlin] 코루틴 Coroutine 사용법 및 개념 정리 - GlobalScope, GlobalScope.launch, Delay, Dispatcher, Coroutine Context - 1편  (1) 2021.06.11
[Kotlin] Collection 정리 list, set, map 차이 - HashMap, hashmapof, mutableMap, setOf, mutableSetOf,ArrayListof,listof 사용법 및 차이  (0) 2021.06.10
[Kotlin] Google AdMob 앱 수익창출 - 광고 달기 배너달기 / 버튼클릭시 전면광고  (0) 2021.06.03
    '개발공부/Kotlin' 카테고리의 다른 글
    • [Kotlin] 코루틴 Coroutine - async와 await, LifecycleScope과 ViewModelScope 사용법 및 사용예제- 4편
    • [Kotlin] 코루틴 Coroutine 제어하기 -Join, repeat,cancel,withTimeout - 3편
    • [Kotlin] 코루틴 Coroutine 사용법 및 개념 정리 - GlobalScope, GlobalScope.launch, Delay, Dispatcher, Coroutine Context - 1편
    • [Kotlin] Collection 정리 list, set, map 차이 - HashMap, hashmapof, mutableMap, setOf, mutableSetOf,ArrayListof,listof 사용법 및 차이
    sean.jin
    sean.jin
    앱개발, 알고리즘, JS, Kotlin, 미국 취업준비

    티스토리툴바