← Назад к вопросам
Какие 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) | N | LinkedBlockingQueue | HTTP сервер |
| newCachedThreadPool() | 0-∞ | SynchronousQueue | IO операции |
| newSingleThreadExecutor() | 1 | LinkedBlockingQueue | Sequential |
| newScheduledThreadPool(n) | N | DelayedWorkQueue | Cron jobs |
| newWorkStealingPool() | CPU cores | ForkJoinQueue | Divide-and-conquer |
| newSingleThreadScheduledExecutor() | 1 | DelayedWorkQueue | Single 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'а — критичен для производительности приложения.