← Назад к вопросам

Какие pool потоков можно создать через фабричный метод

2.2 Middle🔥 191 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Какие pool потоков можно создать через фабричный метод

Java предоставляет фабричные методы в классе Executors для создания различных типов ExecutorService (thread pool'ов).

1. newFixedThreadPool(int nThreads)

// Создает pool с фиксированным количеством потоков
ExecutorService executor = Executors.newFixedThreadPool(10);

// Использование
for (int i = 0; i < 100; i++) {
    executor.submit(() -> {
        // Выполняется одним из 10 потоков
        doSomeWork();
    });
}
executor.shutdown();

Характеристики:

  • Ровно N потоков
  • Задачи стоят в очереди если все потоки заняты
  • Использование: HTTP сервер, известная нагрузка

2. newCachedThreadPool()

// Создает pool, который создает потоки по мере необходимости
ExecutorService executor = Executors.newCachedThreadPool();

// Может создать неограниченное количество потоков
for (int i = 0; i < 10000; i++) {
    executor.submit(() -> doQuickWork());  // Каждая задача на отдельном потоке
}

Характеристики:

  • 0-∞ потоков
  • Создает новый поток если нет свободного
  • Потоки кешируются и переиспользуются
  • Использование: IO-bound операции, асинхронные задачи

3. newSingleThreadExecutor()

// Создает pool с одним потоком
ExecutorService executor = Executors.newSingleThreadExecutor();

// Все задачи выполняются последовательно
for (int i = 0; i < 5; i++) {
    executor.submit(() -> {
        // Выполнится по порядку
        System.out.println("Task " + i);
    });
}

Характеристики:

  • Ровно 1 поток
  • Задачи выполняются строго последовательно
  • Использование: event processing, гарантия порядка

4. newScheduledThreadPool(int corePoolSize)

// Создает pool для планирования задач
ScheduledExecutorService executor = Executors.newScheduledThreadPool(5);

// Выполнить один раз с задержкой
executor.schedule(() -> System.out.println("Hello"), 2, TimeUnit.SECONDS);

// Выполнить периодически
executor.scheduleAtFixedRate(() -> {
    System.out.println("Periodic task");
}, 1, 2, TimeUnit.SECONDS);

Характеристики:

  • N потоков для планирования
  • Поддерживает schedule, scheduleAtFixedRate, scheduleWithFixedDelay
  • Использование: cron jobs, периодические операции

5. newWorkStealingPool() (Java 8+)

// Создает pool на основе ForkJoinPool для task stealing
ExecutorService executor = Executors.newWorkStealingPool();
// По умолчанию количество потоков = количество CPU cores

// Хорошо для divide-and-conquer
executor.submit(() -> {
    // Рекурсивная работа
});

Характеристики:

  • CPU cores потоков
  • Потоки могут "красть" задачи друг у друга если одни заняты
  • Использование: рекурсивные алгоритмы, обработка больших данных

6. newSingleThreadScheduledExecutor()

// Один поток для планирования
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();

// Гарантирует, что все задачи выполняются в одном потоке
executor.scheduleAtFixedRate(this::cleanup, 1, 1, TimeUnit.HOURS);

Характеристики:

  • 1 поток для планирования
  • Порядок выполнения гарантирован
  • Использование: критичные периодические задачи

Сравнительная таблица

МетодПотоковОчередьИспользование
newFixedThreadPool(n)NLinkedBlockingQueueHTTP сервер
newCachedThreadPool()0-∞SynchronousQueueIO операции
newSingleThreadExecutor()1LinkedBlockingQueueSequential
newScheduledThreadPool(n)NDelayedWorkQueueCron jobs
newWorkStealingPool()CPU coresForkJoinQueueDivide-and-conquer
newSingleThreadScheduledExecutor()1DelayedWorkQueueSingle scheduled

Практический пример выбора

// REST API сервер
ExecutorService apiPool = Executors.newFixedThreadPool(50);

// Асинхронные email'ы
ExecutorService emailPool = Executors.newCachedThreadPool();

// Очистка каждый час
ScheduledExecutorService cleanupPool = Executors.newSingleThreadScheduledExecutor();

// Обработка больших файлов
ExecutorService processingPool = Executors.newWorkStealingPool();

Важно: правильное завершение

executor.shutdown();  // Запретить новые задачи
if (!executor.awaitTermination(10, TimeUnit.SECONDS)) {
    executor.shutdownNow();  // Остановить насильно
}

Выбор правильного pool'а — критичен для производительности приложения.

Какие pool потоков можно создать через фабричный метод | PrepBro