Coroutine은 Dispatcher를 통해 어떤 스레드에서 작업 할 것인지 정해진다.
Dispatchers.Main 컨텍스트를 사용하여 CoroutineScope를 실행했을 때 실제로 MainThread에서 동작하는지 알아보기 위해 테스트 해보았다.
class MainActivity2 : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
CoroutineScope(Dispatchers.Main).launch {
Log.d("TEST_LOG", "Main Dispatchers is called")
CoroutineScope(Dispatchers.IO).launch {
Log.d("TEST_LOG", "IO Dispatchers is called")
}
}
Log.d("TEST_LOG", "Main Thread is called")
Thread {
Log.d("TEST_LOG", "thread is called")
runOnUiThread {
Log.d("TEST_LOG", "runOnUiThread is called")
}
}.start()
}
}
테스트를 위해서 MainThead, runOnUiThead, Dispatchers.Main, Dispatchers.IO에서 각각의 로그를 찍어보았다.
2022-06-01 16:09:02.126 12285-12285/com.example.lala_coroutine D/TEST_LOG: Main Thread is called
2022-06-01 16:09:02.133 12285-12307/com.example.lala_coroutine D/TEST_LOG: thread is called
2022-06-01 16:09:02.136 12285-12285/com.example.lala_coroutine D/TEST_LOG: Main Dispatchers is called
2022-06-01 16:09:02.139 12285-12309/com.example.lala_coroutine D/TEST_LOG: IO Dispatchers is called
2022-06-01 16:09:02.154 12285-12285/com.example.lala_coroutine D/TEST_LOG: runOnUiThread is called
출력된 로그를 확인해본 결과
runOnUiThread, Dispatchers.Main, MainThread는 같은 TID(therad-id)를 가지고 있고 이들 모두가 MainThread를 사용하고 있음을 알 수 있다.
다른 Thread에서 찍힌 TID는 당연히 MainThread와 다를 것임을 예상해볼 수있었고, Dispatchers.IO에서 출력된 TID역시 다른 것을 보아 Dispatchers.IO는 MainThread가 아닌 IO작업에 최적화된 위한 별도의 Thread를 Coroutine에 할당해 줌을 알 수있다.