Kotlin 任务调度器:完整概述与使用示例
任务调度器是任何应用程序的重要组成部分,它允许按计划、延迟或周期性地执行代码。在 Kotlin 语言中,尤其是在 JVM、Android 或多平台项目开发中,有多种实现调度器的方法。在本文中,我们将详细介绍主要工具:kotlinx-coroutines-core 的内置功能、java.util.Timer、java.util.concurrent.Executors,以及用于游戏和动画的专用库 korGE。
1. 基于协程的任务调度器 (kotlinx-coroutines-core)
这是 Kotlin 应用程序最现代且推荐的方式。kotlinx-coroutines-core 库为延迟和周期性执行代码提供了灵活的工具。
安装
在 build.gradle.kts 中添加依赖:
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0")}延迟任务 (delay)
在协程内部使用 delay 实现简单的执行延迟:
import kotlinx.coroutines.*
fun main() = runBlocking { println("开始:${System.currentTimeMillis()}") delay(2000) // 延迟 2 秒 println("2 秒后执行:${System.currentTimeMillis()}")}通过 launch 和 while 实现周期性任务
import kotlinx.coroutines.*
fun main() = runBlocking { val job = launch { repeat(5) { i -> println("任务 #${i + 1}:${System.currentTimeMillis()}") delay(1000) } } job.join()}使用 Dispatchers 进行后台线程操作
调度器可以在不同的调度器上运行,例如用于网络操作的 Dispatchers.IO:
import kotlinx.coroutines.*
fun main() = runBlocking { val job = launch(Dispatchers.IO) { println("在线程中执行:${Thread.currentThread().name}") delay(3000) println("完成") } job.join()}2. 经典调度器:java.util.Timer
如果您在 JVM 环境中工作并希望使用传统方法,Timer 和 TimerTask 适用于简单场景。
import java.util.*
fun main() { val timer = Timer() val task = object : TimerTask() { override fun run() { println("周期性任务:${System.currentTimeMillis()}") } } // 1 秒后启动任务,然后每 2 秒执行一次 timer.schedule(task, 1000, 2000)
// 10 秒后停止 Thread.sleep(10000) timer.cancel()}一次性延迟任务
val timer = Timer()timer.schedule(object : TimerTask() { override fun run() { println("3 秒后的一次性任务") }}, 3000)3. 使用 Executors 的调度器 (ScheduledExecutorService)
来自 Java Concurrency 的更强大且灵活的工具,与 Kotlin 集成良好。
import java.util.concurrent.*
fun main() { val scheduler = Executors.newScheduledThreadPool(2)
// 延迟任务 scheduler.schedule({ println("延迟任务:${System.currentTimeMillis()}") }, 2, TimeUnit.SECONDS)
// 固定延迟的周期性任务 val periodicTask = scheduler.scheduleWithFixedDelay({ println("周期性任务:${System.currentTimeMillis()}") }, 1, 3, TimeUnit.SECONDS)
// 15 秒后停止 Thread.sleep(15000) periodicTask.cancel(false) scheduler.shutdown()}