Планировщик задач 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 (для игр и анимаций)

korGE — это мультиплатформенный игровой движок на Kotlin, который включает встроенный планировщик задач для работы с временем, анимациями и таймерами. Он особенно полезен для создания интерактивных приложений и игр.

Установка

dependencies {
    implementation("com.korlibs.korge:korge:4.0.0")
}

Пример использования планировщика в korGE

import korlibs.time.*
import korlibs.korge.*
import korlibs.korge.timer.*

suspend fun main() = Korge(width = 800, height = 600                    

Рекомендаций