Thread์ Context switching๋ง์ ํตํด Concurrency๋ฅผ ๋ณด์ฅํด์ค๋๋ค. ํ์ง๋ง Coroutine์ ์ฌ์ฉํ๋ฉด ์ข ๋ค๋ฅด๋ค๋ ๋ฐ...
๋์ ํ๋ฒ ๋น๊ตํด ๋ณผ๊น์?
๊ฐ ์ฐ๋ ๋๋ง๋ค task๋ฅผ ๊ฐ์ง๊ณ ๊ฐ ์ฐ๋ ๋๋ JVM Stack ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ์ง๋๋ค.
์ฝ๋ฃจํด์ Object๋ JVM Heap์ ์ ์ฌ๋๋ฉฐ, Context๋ฅผ ์ฐ๋ ๋์๊ฒ ์์กดํฉ๋๋ค.(์ฝํ๋ฆฐ์ ์ฝ๋ฃจํด์ Stack์ ๊ฐ์ง์ง ์์ง๋ง Stack์ ๊ฐ์ง๋ ์ฝ๋ฃจํด๋ ์์ต๋๋ค.)
๊ฐ ์ฐ๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์, ๋งค ํธ์ถ๋ง๋ค context switch๊ฐ ํ์ํฉ๋๋ค.
๋ง์ผ task1์์ task2,task3 ํธ์ถํ๊ณ
task4์์ task5๋ฅผ ํธ์ถ task5์์ task6์ ํธ์ถ ํ๋ค๊ณ ํ๋ฉด
context switch๋ ์ด 4๋ฒ, ์ฐ๋ ๋๋ 6๊ฐ๊ฐ ํ์ํ๊ฒ ๋ฉ๋๋ค.
์ฝ๋ฃจํด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ๊ฐ task๊ฐ ์ ํ ๋ ๋๋ง๋ค context switching์ด ํ์ํ์ง ์์ต๋๋ค. ์ฌ์ง์ด ๋ชจ๋ ํ๊ฐ์ ์ฐ๋ ๋์์ ์คํ ๋ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ 0๋ฒ ์ฐ๋ ๋์ 2๋ฒ ์ฐ๋ ๋๋ง ์ฌ์ฉํ์ฌ ์คํ ํ ์๋ ์๊ณ , ๋ง์ผ ์ฌ์ฉํ๋ค๊ณ ํด๋ context switch๋ 2๋ฒ์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
๊ฒฐ๊ตญ Coroutine์
context switching๋ฅผ ์ค์ด๋ฉฐ, ๋ ์ ์ ์ฐ๋ ๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค.
์ฆ, ์ฐ๋ ๋๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํจ์ด๋ผ๊ณ ํ ์ ์๊ฒ ๋ค์.
fun runInThread(){
runBlocking {
println("Active Thread = ${Thread.activeCount()}")
val time = measureTimeMillis {
val jobs = ArrayList<Thread>()
///rep = 1000
repeat(reps) {
jobs += Thread {
Thread.sleep(1000L)
}.also { it.start() }
}
println("Active Thread = ${Thread.activeCount()}")
jobs.forEach { it.join() }
}
println("Took $time ms\n")
}
}
fun runInCoroutine() {
runBlocking {
println("Active Thread = ${Thread.activeCount()}")
val time= measureTimeMillis {
val jobs = ArrayList<Job>()
///rep = 1000
repeat(reps){
jobs+=launch(Dispatchers.Default){
delay(1000L)
}
}
println("end, Active Thread= ${Thread.activeCount()}")
jobs.forEach { it.join() }
}
println("Time: $time ms\n")
}
}
์ฐ๋ ๋์ ์๋ ํจ์ฌ ์ ์ผ๋ฉฐ, ์คํ์๊ฐ๋ ํจ์ฌ ๋จ์ถ ๋์๋ค์. ์ฆ,
์ฝ๋ฃจํด์ ์ฌ์ฉํ ์ฝ๋๊ฐ ์ข ๋ ํจ์จ์ ์ผ๋ก ์ฐ๋ ๋๋ฅผ ํจ์จ์ ๋ํ ์ ์์ต๋๋ค.