Ответ
Теоретически — да, но на практике это крайне неэффективно и приведет к сбоям. Каждый поток потребляет значительные ресурсы и создает нагрузку на планировщик ОС.
Проблемы при создании миллионов потоков:
- Память: Каждому потоку выделяется стек (по умолчанию 1 МБ в 64-битной JVM). 1 млн потоков ≈ 1 ТБ RAM.
- Нагрузка на ОС: Частые переключения контекста (context switching) сведут полезную работу к нулю.
- Лимиты ОС: Системы имеют жесткие ограничения на количество потоков в процессе (например, в Linux лимит задается
ulimit -u).
Пример проблемного кода (не используйте):
for (int i = 0; i < 1_000_000; i++) {
new Thread(() -> {
try { Thread.sleep(Long.MAX_VALUE); }
catch (InterruptedException e) { }
}).start(); // Вызовет OutOfMemoryError: unable to create native thread
}
Правильная альтернатива — пулы потоков (Thread Pools):
ExecutorService executor = Executors.newFixedThreadPool(200); // Размер пула ~число ядер CPU
for (int i = 0; i < 1_000_000; i++) {
executor.submit(() -> {
// Выполнение задачи
});
}
Используйте ExecutorService или асинхронные парадигмы (например, Project Loom с виртуальными потоками).