코틀린 코루틴 라이브러리가 제공하는 중요한 기능은 코루틴이 실행되어야 할 스레드를 결정할 수 있다는 것입니다. 이는 디스패처를 이용해 결정됩니다.
코틀린 코루틴에서 코루틴이 어떤 스레드에서 실행될지 정하는 것은 CoroutineContext입니다.
기본적으로 설정되는 디스패처는 CPU 집약적인 연산을 수행하도록 설계된 Dispatchers.Default입니다. 이 디스패처는 코드가 실행되는 컴퓨터의 CPU 개수와 동일한 수의 스레드 풀을 가지고 있습니다. 스레드를 효율적으로 사용하고 있다고 가정하면 최적의 스레드 수라고 할 수 있습니다.
<aside> 💡
runBlocking은 디스패처가 설정되어있지 않으면 호출된 스레드의 디스패처를 사용하므로, Default로 설정되지 않습니다.
</aside>
Dispatchers.Default의 **limitedParallelism
**을 사용하면 같은 시간에 특정 수 이상의 스레드를 사용하지 못하도록 제한할 수 있습니다.
이 방법은 Dispatchers.Default에만 사용되지 않기 때문에 기억하고 있어야 합니다.
안드로이드에서 메인 스레드는 UI와 상호작용하는 데 사용되는 유일한 스레드입니다. 메인 스레드가 블로킹되면 전체 애플리케이션이 멈춰 버리므로, 메인 스레드에서 코루틴을 실행하려면 Dispatchers.Main을 사용하면 됩니다.
안드로이드에서는 기본 디스패처로 Dispatchers.Main을 주로 사용합니다.
Dispatchers.IO는 시간이 오래걸리는 작업이나 블로킹 함수가 있는 라이브러리가 필요할 때 사용합니다.
Dispatchers.IO는 Dispatchers.Default와 달리 64개의 코어 수로 제한이 됩니다. 이 2개의 디스패처는 동일한 스레드 풀을 공유합니다. 이는 동일한 스레드를 재사용하여 최적화를 한 결과입니다.
각각의 스레드의 한도는 독립적이기 때문에 다른 디스패처의 한도를 채울 경우는 없습니다.
Dispatchers.IO의 스레드는 64개로 제한되기에, 이보다 많은 수의 스레드를 블로킹하는 서비스는 자기 차례가 돌아올 때까지 스레드 전부를 블로킹하게 됩니다. 이런 경우에 이전에 언급했던 **limitedParallelism
**을 사용할 수 있습니다.