Пул потоков

Пул потоков (Thread Pool) — это механизм управления группой рабочих потоков, которые предварительно создаются и поддерживаются для выполнения задач по мере их поступления. Пул потоков помогает уменьшить накладные расходы на создание и уничтожение потоков, а также позволяет ограничить количество одновременно выполняемых задач, что предотвращает перегрузку системы.

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

  1. Эффективность: Повторное использование существующих потоков снижает затраты на создание новых потоков.
  2. Управляемость: Пул потоков позволяет ограничить количество одновременно выполняемых потоков, что помогает предотвратить перегрузку системы.
  3. Упрощение кода: Управление потоками становится более структурированным и менее хаотичным.

Использование пула потоков в Kotlin

В Kotlin для работы с пулом потоков можно использовать классы из библиотеки Java java.util.concurrent, такие как Executors.

Вот несколько примеров использования различных типов пулов потоков:

1. FixedThreadPool

Пул потоков фиксированного размера. Количество потоков остается постоянным, и новые задачи будут ждать в очереди, пока не освободится один из потоков.

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() // Остановка пула после завершения всех задач
}

2. CachedThreadPool

Пул потоков, который создает новые потоки по мере необходимости, но повторно использует старые потоки, если они доступны. Если поток не используется в течение 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() // Остановка пула после завершения всех задач
}

3. ScheduledThreadPool

Пул потоков, который может выполнять задачи с задержкой или периодически.

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