3개의 스레드를 코루틴으로 대체하면, 메모리를 할당하지 않아도 됨
분리된 영역을 처리할때 그 사이에서 데이터의 참조를 하는 것(context switching)을 하는 것이 아님 = 오버헤드가 생기지 않음
suspend를 붙여서 쓴다 / 중간에 다른 작업이 가능!
(중간에 멈출 수 있는 함수라는 뜻)
1. Dispatchers : 코루틴이 실행되는 스레드를 지정한다 (4가지 타입)
2. Job & Deffered
코루틴이라는 흐름을 job 이라는 오브젝트로 사용
= 오브젝트를 취소, 예외처리를 가능하게 하여 작업을 컨트롤 가능하게 해준다 (흐름제어 가능)
Job states cycle
wait children
+-----+ start +--------+ complete +-------------+ finish +-----------+
| New | -----> | Active | ---------> | Completing | -------> | Completed |
+-----+ +--------+ +-------------+ +-----------+
| cancel / fail |
| +----------------+
| |
V V
+------------+ finish +-----------+
| Cancelling | --------------------------------> | Cancelled |
+------------+ +-----------+
suspend fun fetchDocs() { // Dispatchers.Main
val result = get("developer.android.com") // Dispatchers.Main
show(result) // Dispatchers.Main
}
suspend fun get(url: String) = // Dispatchers.Main
withContext(Dispatchers.IO) { // Dispatchers.IO (main-safety block)
/* perform network IO here */ // Dispatchers.IO (main-safety block)
} // Dispatchers.Main
}
스코프는 CoroutineScope를 사용합니다. CPU 작업이냐 IO 작업이냐를 판단하여 Dispatchers를 정의하고 마지막으로 코루틴 처리후 값이 나와야 되는가 아닌가에 따라 launch나 async를 구별해서 사용하면 되겠습니다.
참조 : 냉동코더의 기술블로그