Kotlin 任务调度器:kotlinx-coroutines-core 与 korGE 库

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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()}


4. 专用库:korGE (用于游戏和动画)

推荐