- Dispatcher.Default : CoroutineContext๊ฐ ์ง์ ๋์ง ์์์๋ ์ง์ ๋๋ ๊ธฐ๋ณธ Dispatcher
- launch, async๊ณผ ๊ฐ์ ํ์ค Builder์์ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ Dispatcher
- JVM์ ๊ณต์ ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์ค๋ ๋์ commonPool์์ ๋์
- Dispatcher.IO : I/O ์์ ์ ์ํ Dispatcher
- Dispatcher.Main : ๋ฉ์ธ์ค๋ ๋(UI)์ ๊ตญํ๋ Dispatcher
- Dispatcher.Unconfined : ์ฒซ๋ฒ์งธ ์ค๋จ ํจ์ ํธ์ถ์ ๋ง๋ ๋ ๊น์ง ํธ์ถ ์ค๋ ๋์์ Coroutine์ ์์ํ์ฌ ์ค๋จ ์ดํ์ ์ฌ๊ฐ(resume)๋ ๋๋ ์ค๋จ ํจ์๋ฅผ ์ฌ๊ฐํ ์ค๋ ๋์์ ์ํ๋๋ค.
- Coroutine์ด CPU ์๊ฐ์ ์๋ชจํ์ง ์๊ฑฐ๋ ๊ณต์ ๋๋ ๋ฐ์ดํฐ(UI)๋ฅผ ์ ๋ฐ์ดํธ ํ์ง ์๋ ๊ฒฝ์ฐ์ฒ๋ผ ํน์ ์ค๋ ๋์ ๊ตญํ๋ ์์ ์ด ์๋ ๊ฒฝ์ฐ ์ ์ ํ๋ค.
์ดํ๋ฆฌ์ผ์ด์
์ด ๋์ํ๋๋์ ๋ณ๋์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ์ง์๊ณ ์ฌ์ฉํ ์ ์๋ Scope๋ก
์๋๋ก์ด๋ ์ฑ์ด ์ฒ์ ์์ํ ๋๋ถํฐ ์ข
๋ฃํ ๋ ๊น์ง ํ๋์ CoroutineContext์์์ ๋์ํ๋ค.
Dispatchers.Default์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ค.
ํน์ ํ ๋ชฉ์ ์ Dispatcher๋ฅผ ์ง์ ํ์ฌ ์๋ก์ด Coroutine์ ๋ฒ์๋ฅผ ์ ์ํ๋ค.
๋ชจ๋ Coroutine Builder(launch, async)์ ํ์ฅ์ด๋ค.
- launch
- launch{}์ ์คํ์ผ๋ก Job์ ๋ฐํํ๋ค
- ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋์ด์์ง์๋ค
- ๊ทธ์๋ฆฌ์์ ๋ฐ๋ก ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค
- join()์ ๋ง๋๋ฉด ํ์ฌ Coroutine์ด ์๋ฃ๋๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค (suspend ๋๋ค)
- CoroutineScope๋ฅผ ์ฌ์ฉํ๋ค
- async
- Deffered๋ฅผ ๋ฐํํ๋ค
- ๊ฒฐ๊ณผ๋ฅผ๊ฐ ํฌํจ๋์ด์๋ค
- await()๋ฅผ ๋ง๋๋ฉด ํ์ฌ Coroutine์ด ์๋ฃ๋๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค (suspend ๋๋ค)
- CoroutineScope๋ฅผ ์ฌ์ฉํ๋ค
- produce
- ReceiveChannel์ ๋ฐํํ๋ค
- producer-consumerํจํด์ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๋น๋
- ProducerScope๋ฅผ ์ฌ์ฉํ๋ค
- runBlocking
- Coroutine์ ์์ฑํ ํ Coroutine์ด ์๋ฃ๋์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ ๋๊น์ง ํ์ฌ Thread๋ฅผ Blockํ๋ค
- runBlocking์ ๊ธฐ๋ณธ Dispatcher๋ ์์๋ Threa์ด๋ค
- CoroutineScope๋ฅผ ์ฌ์ฉํ๋ค
launch,async๋ฑ์ Builder ํจ์์์ start ๋งค๊ฐ๋ณ์์ ์ฌ์ฉ๋๋ค. coroutine์ ์์์ ๊ด๋ จํ์ฌ ์ค์ ํ๋ค
- CoroutineStart.DEFAULT: CoroutineContext์ ๋ฐ๋ผ ์ฆ์ Coroutine์ ์์ํ๋ค
- CoroutineStart.LAZY:
start()
ํจ์๋๋await()
์ฌ์ฉํ์ฌ ์์๋ ๋๊น์ง ์์ ์ ์ง์ฐํ๋ค - CoroutineStart.ATOMIC: ์์์ ์ผ๋ก(์ฆ,์ทจ์ํ ์ ์๋ ๋ฐฉ์์ผ๋ก) CoroutineContext์ ๋ฐ๋ผ ์คํ๋๋๋ก Coroutine์ ์์ฝํ๋ค.DEFAULT์ ์ ์ฌํ์ง๋ง ์คํ์ ์์ํ๊ธฐ์ ์ Coroutine์
cancel()
ํ ์ ์๋ค - CoroutineStart.UNDISPATCHED: Coroutine์ด Dispatchers.Unconfined๋ฅผ ์ฌ์ฉํ์ฌ ์์๋ ๊ฒ์ฒ๋ผ ํ์ฌ์ค๋ ๋์์ ์ฒซ๋ฒ์งธ ์ค๋จ์ (suspend)๊น์ง Coroutine์ ์คํํ๋ค. Coroutine์ด ์ค๋จ(suspend)์ด ์ฌ๊ฐ๋์์๋์ ์ค๋ ๋์์ ๋ค์ ์ํ๋๋ค
- ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์๋ฃ๋ก ๋๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ทจ์ํ ์ ์๋ค.
- ์์-ํ์ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ์์ Job์ ์ทจ์ํ๋ฉด ํ์Job์ด ์ฆ์ ์ทจ์๋๋ค.
Job์ Coroutine์ 6๊ฐ์ง ์ํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. Job์ผ๋ก Coroutine์ ์ํ๋ฅผ ํ์ธํ ์ ์๊ณ ์ ์ดํ ์ ์๋ค.
state | isActive | isCompleted | isCancelled |
---|---|---|---|
New(optional init state) | false | false | false |
Active(default init state) | true | false | false |
Completing(transient state) | true | false | false |
Cancelling(transient state) | false | false | true |
Cancelled(final state) | false | true | true |
Completed(final state) | false | true | false |
- start : ์์ง ์์๋์ง ์์ Job์ด ์๋๊ฒฝ์ฐ ๊ด๋ จํ Coroutine์ ์์ํ๋ค
- ๋์์ค์ธ๊ฒฝ์ฐ true, ์ค๋น ๋๋ ์๋ฃ์ํ์ด๋ฉด false๋ฅผ returnํ๋ค
- join : ํ์ฌ ๋์์ค์ธ Coroutine ๋์์ด ๋๋ ๋ ๊น์ง ๋๊ธฐํ๋ค
async{} await
์ ๋น์ทํ ๊ฐ๋
- cancel : Job์ ์ทจ์
- cancelAndJoin : ํ์ฌ Job์ ์ทจ์ํ๊ณ ์ทจ์๋ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ๋๊ธฐํ๋ค.
- cancelChildren : ํ์ฌ Coroutine์ ํ์ Job์ ๋ชจ๋ ์ทจ์ํ๋ค
- ensureActive : ํ์ฌ Job์ด ํ์ฑ ์ํ์ธ์ง ํ์ธ
- invokeOnCompletion : Job์ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๊ณ ์๋ฃ ๋๋ ์ทจ์๋ ๋ ํธ๋ค๋ฌ ํธ์ถ
- CompletableJob : complete()๋ฅผ ์ฌ์ฉํ์ฌ Job์ ์๋ฃ์ฒ๋ฆฌํ ์ ์๋ค.
- SupervisorJob : children Job๋ค์ค ํ๋๊ฐ ์คํจํ๋๋ผ๋ ๋ค๋ฅธ children Job์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- Deferred : async{}์์ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ ์๋ Job
- NonCancellable : ํญ์ ํ์ฑ์ํ์ธ ์ทจ์ ๋ถ๊ฐ๋ฅํ Job
Channel์ ๊ฐ๋
์ ์ผ๋ก BlockingQueue์ ์ ์ฌํ๋ค.
BlockingQueue์์ put์ ํ ๋ ๊ฐ๋ ์ฐจ์๋ค๋ฉด Blockํ์ฌ ๋๊ธฐํ๊ณ , take๋ฅผ ํ ๋ ๋น์ด์๋ค๋ฉด Blockํ์ฌ ๋๊ธฐํ๋ค
Channel์ ๋น์ทํ๊ฒ send์ receive๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐ๋ผ์ ์ฌ๋ฌ coroutine ์ฌ์ด์ ์์๋ฅผ ๋ณด์ฅ๋ฐ์ผ๋ฉฐ ๊ณต์ ํ์ฌ ์ฌ์ฉํ ์ ์๋ค.
๋ํ Channel์ Queue์ ๋ฌ๋ฆฌ ๋ ์ด์ ์ฌ์ฉํ์ง ์์๋ close ์ํฌ ์ ์๋ค.
Channel์ด close๋์์ ๋, close์ ๊น์ง sendํ๋ Element๋ค์ ๋จ์์๋ค.
- send : Element๋ฅผ ์ฑ๋๋ก ์ ์ก. ์ฑ๋์ ๋ฒํผ๊ฐ ๊ฐ๋์ฐจ ์๋ค๋ฉด Blockํ์ฌ ๋๊ธฐ
- receive : Element๋ฅผ ์ ๋ฌ๋ฐ์ ์ฌ์ฉ. ์ฑ๋์ด ๋น์ด์๋ค๋ฉด Blockํ์ฌ ๋๊ธฐ
- cancel : ์ฑ๋์ ๋๋จธ์ง Element ์์ ์ ์ทจ์ํ๋ค. ์ฑ๋์ ๋ซ๊ณ ๋ฒํผ๋ง๋ ๋ชจ๋ Element๋ค์ ์ ๊ฑฐํ๋ค
- close : ์ฑ๋์ ๋ซ์ง๋ง, ๋ฒํผ๋ง๋ ์์๋ค์ ์ฌ์ฉ๊ฐ๋ฅํ๋ค
- invokeOnClose : ์ฑ๋์ด ๋ซํ๊ฑฐ๋ ์ทจ์๋ ๋ ํธ์ถ๋๋ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๋ค
- offer : ์ฑ๋์ Element๋ฅผ ์ถ๊ฐํ์ง๋ง coroutine์ suspendํ์ง์๋๋ค
- poll : ์ฑ๋์์ Element๋ฅผ ๋ฐ์ง๋ง coroutine์ suspendํ์ง์๋๋ค
- RENDEVOUS
- BUFFERED
- UNLIMITED
- CONFLATED
- delay : ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง์๊ณ Coroutine์ ์ฃผ์ด์ง ์๊ฐ๋์ ์ง์ฐํ๋ค ๋ค์ ์์
- yeild : ํ์ฌ Coroutine์ Dispatcher์ Thread๋ฅผ ๊ฐ๋ฅํ๊ฒฝ์ฐ ๋ค๋ฅธ Coroutine์ ์๋ณดํ๋ค
- withContext : ์ง์ ๋ CoroutineContext๋ฅผ ๋ค๋ฅธ CoroutineContext๋ก ๋ณ๊ฒฝํ๋ค
- CoroutineContext์ ์ Dispatcher๊ฐ ์ง์ ๋ ๊ฒฝ์ฐ์๋ block์คํ์ ๋ค๋ฅธ ์ค๋ ๋๋ก ์ด๋ํ๊ณ ์๋ฃ๋ ์์ ์๋ Dispatcher๋ก ๋์๊ฐ๋ค
- withTimeout : ์ง์ ๋ ์ ํ์๊ฐ๋ด์ block๋ด์ Coroutine์ด ์๋ฃ๋์ง์์๊ฒฝ์ฐ TimeoutCancellationException์ throwํ๋ค
- withTimoeoutOrNull : ์ง์ ๋ ์ ํ์๊ฐ๋ด์ block๋ด์ Coroutine์ด ์๋ฃ๋์ง์์๊ฒฝ์ฐ null์ ๋ฐํํ๋ค
- awaitAll : ์ฃผ์ด์ง ๋ชจ๋ ์์
์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฐ๋ค
- ์ฃผ์ด์ง ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ํ์ฌ Coroutine์ suspendํ๋ค
- e.g.
async{}
์ ์๋ฃ ๋๊ธฐ
- joinAll : ์ฃผ์ด์ง ๋ชจ๋ ์์
์ด ์๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฐ๋ค
- ์ฃผ์ด์ง ๋ชจ๋ ์์ ์ด ์๋ฃ๋ ๋๊น์ง ํ์ฌ Coroutine์ suspendํ๋ค
- e.g.
launch{}
์ ์๋ฃ ๋๊ธฐ