Kotlin - Timer, 주기적으로 함수 실행

코틀린에서 Timer로 어떤 함수나 작업을 주기적으로 실행하는 방법을 소개합니다. Timer를 이용하면 초기 지연 후 함수를 실행하거나, 일정 시간 간격으로 동일한 작업을 반복할 수 있습니다.

1. 초기 지연 후, 함수 1회 실행

Timer().schedule(milliseconds) { }는 인자로 전달된 milliseconds 후에 { } 안의 코드들을 수행합니다. 1회성으로 한번만 수행하며, 주기적으로 수행하지는 않습니다.

아래 예제는 2초 뒤에 특정 동작을 수행하는 예제입니다. 로그에 시간도 함께 출력하여 언제 코드가 수행되었는지 확인할 수 있습니다.

import java.time.LocalDateTime
import java.util.*
import kotlin.concurrent.schedule

fun main() {

    println("schedule a job: " + LocalDateTime.now())

    Timer().schedule(2000) {
        println("running a job: " + LocalDateTime.now())
    }

    println("done: " + LocalDateTime.now())
}

Output:

schedule a job: 2022-09-15T21:42:13.033
done: 2022-09-15T21:42:13.034
running a job: 2022-09-15T21:42:15.034

위의 코드들은 아래와 같이 구현할 수도 있습니다.

import java.time.LocalDateTime
import java.util.*

fun main() {

    println("schedule a job: " + LocalDateTime.now())

    Timer().schedule(object : TimerTask() {
        override fun run() {
            println("running a job: " + LocalDateTime.now())
        }
    }, 1000)

    println("done: " + LocalDateTime.now())
}

2. 초기 지연 후, 주기적으로 함수 실행

Timer().scheduleAtFixedRate(initialDelay, intervalDelay) { }는 initialDelay 동안 지연 후, intervalDelay 간격 마다 주기적으로 { }의 코드를 수행합니다.

아래 예제는 1초 뒤에 특정 작업을 수행하며, 3초 간격으로 동일한 작업을 반복하는 예제입니다.

import java.time.LocalDateTime
import java.util.*
import kotlin.concurrent.scheduleAtFixedRate

fun main() {

    println("schedule a job: " + LocalDateTime.now())

    Timer().scheduleAtFixedRate(1000, 3000) {
        println("running a job: " + LocalDateTime.now())
    }

    println("done: " + LocalDateTime.now())
}

Output:

schedule a job: 2022-09-15T21:46:23.432
done: 2022-09-15T21:46:23.433
running a job: 2022-09-15T21:46:24.433
running a job: 2022-09-15T21:46:27.434
running a job: 2022-09-15T21:46:30.433
running a job: 2022-09-15T21:46:33.433
....

위의 코드들은 아래와 같이 구현할 수도 있습니다.

import java.time.LocalDateTime
import java.util.*

fun main() {

    println("schedule a job: " + LocalDateTime.now())

    Timer().scheduleAtFixedRate( object : TimerTask() {
        override fun run() {
            println("running a job: " + LocalDateTime.now())
        }
    }, 1000, 3000)

    println("done: " + LocalDateTime.now())
}
Loading script...
codechachaCopyright ©2019 codechacha