단일 스레드 애플리케이션이 아닌 멀티 스레드 프로그래밍을 통해 병렬 처리를 하여 앱의 성능을 크게 끌어올릴 수 있지만, 멀티 스레드 프로그래밍에도 한계가 존재한다.
스레드의 이 특징들을 잘 기억하면서 아래 그림을 보자.
그림을 보면 Thread-0에서 작업1을 진행하는데, 작업2의 결과가 작업1에 필요하다. 작업1이 작업2에 의존하고 있다. 앱에서 이런 일은 굉장히 자주 일어난다. 예를 들면, 네트워크 통신으로 가져온 데이터를 DB에 저장해야 한다던지, 네트워크 통신으로 받은 결과값으로 또다른 네트워크 통신을 해야 한다던지.. 이런 예시들이 있다.
그런데 이렇게 작업2의 결과가 작업1에 필요할 때, 작업1을 진행중이던 Thread-0은 작업2의 결과를 받을 때까지 기다려야 한다. 스레드는 하나의 작업을 수행할 때 해당 스레드에서 다른 작업을 동시에 수행하지 못하기 때문이다.
이렇게 스레드가 아무것도 하지 못하고 사용할 수 없는 상태에 있는 것을 스레드 블로킹이라고 한다. 스레드라는 비싼 자원을 사용할 수 없기 때문에 자원이 낭비되고 이는 성능 저하를 야기시킨다. 앱이 복잡해지면 작업 간의 의존성도 복잡해지기 때문에 멀티 스레드 프로그래밍에서 스레드 블로킹은 사실 피할 수 없는 현상이다.
코루틴은 스레드에서 작업 실행 도중 일시 중단할 수 있는 작업 단위이다. 코루틴은 작업이 일시 중단되면 스레드의 사용 권한을 양보하며, 양보된 해당 스레드는 다른 작업을 실행하는 데 사용 가능하다. 일시 중단된 코루틴은 재개 시점에 다시 스레드에 할당되어 실행된다.
위의 그림을 보면 코루틴1이 실행되다가 코루틴2의 결과를 기다려야 하는 상황이다. 코루틴2의 결과를 반환받을 때까지 일시 중단하고 Thread-0의 사용권한을 양보한다. 그래서 이때 Thread-0를 사용 가능하기 때문에 코루틴3이 Thread-0에 할당되어 작업을 실행한다. 그리고 코루틴2의 결과가 반환될 때 코루틴1이 다시 Thread-0에 할당되어 실행된다. 이렇게 하면 스레드 블로킹이 일어나지 않고, 자원 낭비 없이 온전히 스레드를 최대한의 효율로 사용 가능하다.
코루틴은 스레드를 점유하지 않고 스레드 사용 권한을 양보하여 스레드 블로킹을 방지하고, 스레드에 비해서 생성과 전환 비용이 적게 들기 때문에 코루틴을 경량 스레드라고도 부른다.
코루틴을 사용하면 스레드 블로킹 없이 비동기적으로 작업을 처리하기 때문에 앱의 응답성과 성능을 크게 향상시킬 수 있다.