Можно ли создать миллион потоков (Thread) в Java?

«Можно ли создать миллион потоков (Thread) в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Теоретически — да, но на практике это крайне неэффективно и приведет к сбоям. Каждый поток потребляет значительные ресурсы и создает нагрузку на планировщик ОС.

Проблемы при создании миллионов потоков:

  • Память: Каждому потоку выделяется стек (по умолчанию 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 с виртуальными потоками).