Job

์ฝ”ํ‹€๋ฆฐ ์ฝ”๋ฃจํ‹ด์—์„œ Job์€ ์ฝ”๋ฃจํ‹ด์˜ ์ƒ๋ช…์ฃผ๊ธฐ์™€ ์‹คํ–‰ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. ์ฝ”๋ฃจํ‹ด์„ ์ƒ์„ฑํ•  ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” Job ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ฝ”๋ฃจํ‹ด์˜ ์‹œ์ž‘, ์ทจ์†Œ, ์™„๋ฃŒ ์—ฌ๋ถ€ ๋“ฑ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ๋„ ์ฝ”๋ฃจํ‹ด์˜ ํ๋ฆ„์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Job์˜ ์—ญํ• 

  • ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ: ์ฝ”๋ฃจํ‹ด์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ์™„๋ฃŒ๊นŒ์ง€์˜ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ทจ์†Œ ๊ธฐ๋Šฅ ์ œ๊ณต: ํ•„์š”์— ๋”ฐ๋ผ ์ฝ”๋ฃจํ‹ด์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ทจ์†Œ ์‹œ ์ž์‹ ์ฝ”๋ฃจํ‹ด๊นŒ์ง€ ์ „ํŒŒ๋ฉ๋‹ˆ๋‹ค.

  • ์™„๋ฃŒ ๋Œ€๊ธฐ: join() ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ฝ”๋ฃจํ‹ด์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Job ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ

์ฝ”๋ฃจํ‹ด ๋นŒ๋”์ธ launch๋‚˜ async๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋ฃจํ‹ด์„ ์ƒ์„ฑํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ Job ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

val job: Job = launch {
    // ์ฝ”๋ฃจํ‹ด์—์„œ ์ˆ˜ํ–‰ํ•  ์ž‘์—…
}

์ด๋ ‡๊ฒŒ ์ƒ์„ฑ๋œ Job ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋ฃจํ‹ด์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Job์˜ ์ฃผ์š” ๋ฉ”์„œ๋“œ์™€ ์†์„ฑ

  • cancel(): ์ฝ”๋ฃจํ‹ด์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค. ์ทจ์†Œ๋œ ์ฝ”๋ฃจํ‹ด์€ CancellationException์„ ๋ฐœ์ƒ์‹œํ‚ค๋ฉฐ, ์ฝ”๋ฃจํ‹ด ๋‚ด์—์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    job.cancel()
  • join(): ์ฝ”๋ฃจํ‹ด์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ผ์‹œ ์ค‘๋‹จํ•ฉ๋‹ˆ๋‹ค.

    job.join()
  • cancelAndJoin(): ์ฝ”๋ฃจํ‹ด์„ ์ทจ์†Œํ•˜๊ณ , ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค.

    job.cancelAndJoin()
  • isActive: ์ฝ”๋ฃจํ‹ด์ด ํ™œ์„ฑํ™”๋˜์–ด ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    if (job.isActive) {
        // ์‹คํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ ์ˆ˜ํ–‰ํ•  ์ž‘์—…
    }
  • isCompleted: ์ฝ”๋ฃจํ‹ด์ด ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    if (job.isCompleted) {
        // ์™„๋ฃŒ๋œ ํ›„ ์ˆ˜ํ–‰ํ•  ์ž‘์—…
    }

Job์˜ ๊ณ„์ธต ๊ตฌ์กฐ์™€ ์ทจ์†Œ ์ „ํŒŒ

Job์€ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์˜ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ ์ฝ”๋ฃจํ‹ด ๋‚ด์—์„œ ์ž์‹ ์ฝ”๋ฃจํ‹ด์„ ์ƒ์„ฑํ•˜๋ฉด, ์ž์‹ ์ฝ”๋ฃจํ‹ด์˜ Job์€ ๋ถ€๋ชจ์˜ Job์— ์ข…์†๋ฉ๋‹ˆ๋‹ค.

val parentJob = launch {
    val childJob = launch {
        // ์ž์‹ ์ฝ”๋ฃจํ‹ด์˜ ์ž‘์—…
    }
}

๋ถ€๋ชจ Job์ด ์ทจ์†Œ๋˜๋ฉด ์ž์‹ Job๋„ ํ•จ๊ป˜ ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ์ฝ”๋ฃจํ‹ด์ด ํ˜‘๋ ฅํ•˜์—ฌ ์ž‘์—…ํ•  ๋•Œ, ์ „์ฒด ์ž‘์—…์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Job์˜ ์ƒํƒœ

Job์€ ์ฝ”๋ฃจํ‹ด์˜ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์ƒํƒœ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • New: ์ฝ”๋ฃจํ‹ด์ด ์ƒ์„ฑ๋˜์—ˆ์ง€๋งŒ ์•„์ง ์‹œ์ž‘๋˜์ง€ ์•Š์€ ์ƒํƒœ.

  • Active: ์ฝ”๋ฃจํ‹ด์ด ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ.

  • Completing: ์ฝ”๋ฃจํ‹ด์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜์—ˆ์ง€๋งŒ, ์•„์ง ์™„๋ฃŒ ์ฒ˜๋ฆฌ ์ค‘์ธ ์ƒํƒœ.

  • Completed: ์ฝ”๋ฃจํ‹ด์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋œ ์ƒํƒœ.

  • Cancelling: ์ฝ”๋ฃจํ‹ด์ด ์ทจ์†Œ ์š”์ฒญ์„ ๋ฐ›์•„ ์ข…๋ฃŒ ์ค‘์ธ ์ƒํƒœ.

  • Cancelled: ์ฝ”๋ฃจํ‹ด์ด ์ทจ์†Œ๋˜์–ด ์ข…๋ฃŒ๋œ ์ƒํƒœ.

์˜ˆ์ œ ์ฝ”๋“œ

์•„๋ž˜๋Š” Job์„ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋ฃจํ‹ด์„ ๊ด€๋ฆฌํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

fun main() = runBlocking {
    val job = launch {
        repeat(10) { i ->
            println("์ฝ”๋ฃจํ‹ด ์ž‘์—… ์ค‘... $i")
            delay(300L)
        }
    }

    delay(1000L)
    println("๋ฉ”์ธ: ์ฝ”๋ฃจํ‹ด์„ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.")
    job.cancelAndJoin()
    println("๋ฉ”์ธ: ์ฝ”๋ฃจํ‹ด์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
}

์„ค๋ช…:

  • launch๋ฅผ ํ†ตํ•ด ์ฝ”๋ฃจํ‹ด์„ ์ƒ์„ฑํ•˜๊ณ , Job ๊ฐ์ฒด๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

  • repeat์™€ delay๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฉ”์ธ ์ฝ”๋ฃจํ‹ด์—์„œ delay(1000L)๋กœ 1์ดˆ๊ฐ„ ๋Œ€๊ธฐํ•œ ํ›„, job.cancelAndJoin()์„ ํ˜ธ์ถœํ•˜์—ฌ ์ฝ”๋ฃจํ‹ด์„ ์ทจ์†Œํ•˜๊ณ  ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

Job์˜ ํ™œ์šฉ ์‚ฌ๋ก€

  • ๋„คํŠธ์›Œํฌ ์š”์ฒญ ์ทจ์†Œ: ์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์„ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ ์ทจ์†Œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ ์ง„ํ–‰ ์ค‘์ธ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํƒ€์ž„์•„์›ƒ ์ฒ˜๋ฆฌ: ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ์™„๋ฃŒ๋˜์ง€ ์•Š๋Š” ์ž‘์—…์„ ์ทจ์†Œํ•˜์—ฌ ๋ฆฌ์†Œ์Šค๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ณ‘๋ ฌ ์ž‘์—… ๊ด€๋ฆฌ: ์—ฌ๋Ÿฌ ์ฝ”๋ฃจํ‹ด์„ ์‹คํ–‰ํ•˜๊ณ , ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ž‘์—…์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜ ์‚ฌํ•ญ

  • ์ฝ”๋ฃจํ‹ด ๋‚ด๋ถ€์—์„œ ์ทจ์†Œ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ์ทจ์†Œ ๊ฐ€๋Šฅ ์ง€์ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. delay, yield ๋“ฑ์˜ ํ•จ์ˆ˜๋Š” ์ทจ์†Œ ๊ฐ€๋Šฅ ์ง€์ ์œผ๋กœ, ์ฝ”๋ฃจํ‹ด์ด ์ทจ์†Œ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  CancellationException์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

  • ์ทจ์†Œ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ๋ธ”๋ก์ด ์žˆ์œผ๋ฉด ์ฝ”๋ฃจํ‹ด์ด ์ฆ‰์‹œ ์ทจ์†Œ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์žฅ์‹œ๊ฐ„ ์‹คํ–‰๋˜๋Š” ์ž‘์—…์€ ์ ์ ˆํžˆ ๋ถ„ํ• ํ•˜์—ฌ ์ทจ์†Œ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

Job์€ ์ฝ”๋ฃจํ‹ด์˜ ์‹คํ–‰๊ณผ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋ฃจํ‹ด์˜ ์ƒํƒœ๋ฅผ ์ œ์–ดํ•˜๊ณ , ๋ณต์žกํ•œ ๋น„๋™๊ธฐ ์ž‘์—…์—์„œ๋„ ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Last updated

Was this helpful?