๋ฐ์ํ
๋์์ด ๋ง์ด ๋์๋ค.
Ref.
Youtube : [์์ฐจ์, ์ฝํ๋ฆฐ ์ฝ๋ฃจํด] https://youtube.com/playlist?list=PLbJr8hAHHCP5N6Lsot8SAnC28SoxwAU5A
Ref : https://kotlinlang.org/
Cancelation
์คํ ํ๋ ์ฝ๋ฃจํด์ ์ทจ์ ํ๋ ๋ฐฉ๋ฒ → ์ทจ์ ํ๋ ๊ฒ์ด ์ค์ํ ์ด์ ๋ ํ๋ํ๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ฆฌ์์ค๋ฅผ ์ฐจ์งํ๊ณ ์๊ธฐ ๋๋ฌธ
์ฝ๋ฃจํด ์ทจ์์ ์กฐ๊ฑด
1) Cancel ํธ์ถ
2) ์ฝ๋ฃจํด ์์ฒด๊ฐ ์ทจ์์ ๋ํด ํ์กฐ์ ์ธ ์ํ๋ก ๊ตฌํ๋์ด์์ด์ผํจ.
// ๋จ์ ์ฝ๋ฃจํด ์ทจ์
// job ๊ฐ์ฒด๋ ์คํ๋๊ณ ์๋ ์ฝ๋ฃจํด์ ์ทจ์ํ๊ฒ๋ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์
fun main() = runBlocking{
// ์ด ์ฝ๋ฃจํด์ 1000๋ฒ์ ๋๋ฉด์ 0.5์ด ๊ฐ๊ฒฉ์ผ๋ก ์ซ์๋ฅผ ์ถ
val job = launch {
repeat(1000){
println("job: I'm sleeping ${it}...")
delay(500L) //suspend func
}
}
delay(1300L)
println("main : I'm Tired of waiting")
job.cancel() // 1.3์ด ์ ๋ ์ง๋๋ฉด ์ด APP ์ด ๋๋ฌ์ผ๋ฉด ์ข๊ฒ ์.
job.join()
println("main : Now i can quit.")
}
/ ์ฝ๋ฃจํด ์ทจ์์ ์กฐ๊ฑด - supending functions ์ ์ทจ์ ๊ฐ๋ฅํ๋ค.
// suspend ํจ์๋ฅผ ํ๋๋ผ๋ ๋์ง ์์ผ๋ฉด ํด๋น ์ฝ๋ฃจํด์ ์คํ ์ทจ์ ํ ์ ์๋ค.
fun main() = runBlocking {
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default){
var nextPrintTime = startTime
var i = 0
while(i < 5){
if (System.currentTimeMillis() >= nextPrintTime){
yield() // suspend func : ๋๋ ์ด๋ฅผ ์ฃผ์ง ์๊ณ ๋ ์ข
๋ฃ๋ฅผ ์ฒดํฌ ํ ์ ์์
// delay(1L) suspend func ์ด ๋ฐ๋์
println("job: I'm sleeping ${i++}...")
nextPrintTime += 500L
}
}
}
delay(1300L)
println("main : I'm tired of waiting")
job.cancelAndJoin() // cancel ๊ณผ join ์ ์์ฐจ์ ์ผ๋ก ๋ถ๋ฌ์ฃผ๋ ํจ์
// cancel ๋์ ์ผ์ ์ค๋จ ํจ์(yield ๋ delay)์ ์ ์ผ์ ์ค๋จ์ด ๋์๋ค๊ฐ ์ฌ๊ฐ ๋ ๋, exception์ ๋์ง๋ค.
println("main : Now i can quit")
}
isActive
// ์ฝ๋ฃจํด์ด ์ทจ์ ๋๊ธฐ ์ํด์ ํ์กฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ทจํ๋๋ฐ ํฌ๊ฒ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋๋ฐ 2๋ฒ์งธ ๋ฐฉ๋ฒ์?
// ( ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ ์์์ ๋ดค๋ค ์ฃผ๊ธฐ์ ์ผ๋ก suspending ํธ์ถํด๋ผ / ๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋ช
์์ ์ผ๋ก ์ํ๋ฅผ ์ฒดํฌ ํ์ฌ _isActive_๋ก)
// isActive : CourouineScope์ Boolean ๊ฐ
// exception ์ ๋์ง์ง๋ ์๋๋ค.
fun main() = runBlocking {
val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default){
var nextPrintTime = startTime
var i = 0
while(isActive){
if(System.currentTimeMillis() >= nextPrintTime){
println("job : I'm Sleeping ${i++} ..")
nextPrintTime +=500L
}
}
}
delay(1300L)
println("main : Tired waiting")
job.cancelAndJoin()
println("main : Now I can quit")
}
finally
: ๋คํธ์ํฌ๋ DB ์ฐ๋ค๊ฐ ๊ฐ์๊ธฐ ์ฝ๋ฃจํด ์บ์ฌ ๋๋ ๋ฑ์ ์ผ์ด ์์ ๋, ๋ซ์์ฃผ๋ ์์น
// ์ฝ๋ฃจํด์ ์ข
๋ฃํ ๋, ์ด๋ป๊ฒ ๋ฆฌ์์ค๋ฅผ ํด์ ํ์ฌ ์ค ์ ์๋๊ฐ?
// ๋คํธ์ํฌ๋ DB๋ฅผ ์ฐ๋ค๊ฐ ๊ฐ์๊ธฐ ์ฝ๋ฃจํด cancel ๋๋ฉด ์ด ํ์ผ์ ๋ซ์์ฃผ๊ณ ๊ฐ์ผ ํ๋๋ฐ, ์ด ๋ซ์์ฃผ๋ ์์น๊ฐ ์ด๋์ธ๊ฐ? ๋ซ์์ฃผ๋ ๊ฑด finally
fun main() = runBlocking {
val job = launch(Dispatchers.Default){
try{
repeat(1000){
i -> println("job: I'm sleeping ${i} ...")
val curTime = System.currentTimeMillis() // 1970๋
1/1์ผ ๋ถํฐ ๊ฒฝ๊ณผํ ์๊ฐ์ long ๊ฐ์ผ๋ก ๋ฆฌํดํจ
val timeFormat:SimpleDateFormat = SimpleDateFormat("yyyy-mm-dd hh:mm:ss")
val str = timeFormat.format(Date(curTime))
println(str)
println(Date(curTime))
println()
delay(500L) // ์ทจ์์ ํ์กฐ์ ์ผ๋ก ๊ตฌํ์ด ๋์ด์์
}
}finally {
// ๋ฆฌ์์ค ํด์ ์ง์ญ
println("job: i'm runnig finally")
}
}
delay(1300L)
println("main : Tired waiting")
job.cancelAndJoin() // ์ผ์ ์ค๋จ ๋์๋ค๊ฐ ์ฌ๊ฐ ๋ ๋, exception์ ๋์ง ๋ finally ๋ธ๋ก์์ ๋ฆฌ์์ค ํด์ ๋ฅผ ํด๋ผ.
println("main : Now I can quit")
}
Timeout
// Timeout
// ์ฝ๋ฃจํด์ด ์์๋ ๋, ์ด ์๊ฐ์ด ์ง๋๋ฉด ์ด ์ฝ๋ฃจํด์ ์ทจ์ ๋๋ค. ๋ฏธ๋ฆฌ ํ์ ์์์ ์ง์ ํ๋ ๋ฐฉ์
// withTimeout์ ์ฐ๋ฉด TimeoutCancellationException ์ด ๋๋๋ฐ,
// withTimeoutOrNull ์ด๋ฉด Exception๋ฌ์ ๋, ๊ฒฐ๊ณผ ๊ฐ์ด null๋ก ๋จ์ด์ง.
fun main() = runBlocking {
val result = withTimeoutOrNull(2000L){
repeat(1000){
i -> println("i'm sleeping ${i}..")
delay(500L)
}
"Done"
}
println("Result is ${result}")
}
๋ฐ์ํ
'Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[3] Kotiln Coroutines - Suspending Function (0) | 2021.07.27 |
---|---|
[1] Kotiln Coroutines - Coroutine Builder/Scope/Suspend function/Structured Concurrency (0) | 2021.07.23 |
Kotlin : Repeat / Git Overide r-- r-- r-- ํด๊ฒฐ (0) | 2021.07.23 |
[๋ฏธ์ Kotlin_Android] MVVM ํจํด (0) | 2021.07.19 |
IntelliJ ์ค์น ์ ์ปดํ์ผ ์ค๋ฅ (0) | 2021.07.19 |
๋๊ธ