Kotlin - Timer、定期的に関数を実行する

コトリンからタイマーへの任意の関数やタスクを定期的に実行する方法を紹介します。 Timerを使用すると、初期遅延後に関数を実行したり、一定の時間間隔で同じ操作を繰り返すことができます。

1. 初期遅延後、関数1回実行

Timer().schedule(milliseconds) { } は、引数として渡された milliseconds の後に { } 内のコードを実行します。 ワンタイムで一度だけ行い、定期的には行いません。

以下の例は、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())
}
codechachaCopyright ©2019 codechacha