Пул потоков
Пул потоков (Thread Pool) — это механизм управления группой рабочих потоков, которые предварительно создаются и поддерживаются для выполнения задач по мере их поступления. Пул потоков помогает уменьшить накладные расходы на создание и уничтожение потоков, а также позволяет ограничить количество одновременно выполняемых задач, что предотвращает перегрузку системы.
В Kotlin для работы с пулом потоков можно использовать классы из библиотеки Java java.util.concurrent
, такие как Executors
.
Вот несколько примеров использования различных типов пулов потоков:
Пул потоков фиксированного размера. Количество потоков остается постоянным, и новые задачи будут ждать в очереди, пока не освободится один из потоков.
fun main() {
val executor = Executors.newFixedThreadPool(3) // Пул из 3 потоков
repeat(5) { index ->
executor.execute {
println("Task $index is running on thread ${Thread.currentThread().name}")
Thread.sleep(1000) // Симуляция выполнения задачи
println("Task $index is completed")
}
}
executor.shutdown() // Остановка пула после завершения всех задач
}
Пул потоков, который создает новые потоки по мере необходимости, но повторно использует старые потоки, если они доступны. Если поток не используется в течение 60 секунд, он уничтожается.
fun main() {
val executor = Executors.newCachedThreadPool()
repeat(5) { index ->
executor.execute {
println("Task $index is running on thread ${Thread.currentThread().name}")
Thread.sleep(1000) // Симуляция выполнения задачи
println("Task $index is completed")
}
}
executor.shutdown() // Остановка пула после завершения всех задач
}
Пул потоков, который может выполнять задачи с задержкой или периодически.
import java.util.concurrent.Executors
import java.util.concurrent.TimeUnit
fun main() {
val scheduler = Executors.newScheduledThreadPool(2) // Пул из 2 потоков
scheduler.schedule({
println("Task is running on thread ${Thread.currentThread().name}")
}, 2, TimeUnit.SECONDS) // Задача выполняется через 2 секунды
scheduler.scheduleAtFixedRate({
println("Periodic task is running on thread ${Thread.currentThread().name}")
}, 1, 3, TimeUnit.SECONDS) // Задача выполняется каждые 3 секунды, начиная через 1 секунду
// Для примера даем задачам немного времени для выполнения перед завершением программы
Thread.sleep(10000)
scheduler.shutdown() // Остановка пула после завершения всех задач
}
После того как все задачи отправлены на выполнение, пул потоков следует корректно завершить с помощью метода shutdown()
. Этот метод завершает работу пула после завершения всех текущих задач. Если требуется немедленно остановить все потоки, можно использовать метод shutdownNow()
.