Планировщик задач 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 Также в библиотеке
Отправка email на C++: библиотеки и примеры кода
Планировщик задач Swift: GCD, OperationQueue и Timer на iOS/macOS
PDF генерация в Swift: создание документов для iOS и macOS