Как в Java выполнять несколько задач одновременно?

«Как в Java выполнять несколько задач одновременно?» — вопрос из категории Софт-скиллы, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

В Java для параллельного выполнения задач используется многопоточность. Основные подходы:

  1. Класс Thread — базовый механизм.

    new Thread(() -> {
        System.out.println("Задача в отдельном потоке");
    }).start();
  2. ExecutorService (рекомендуется) — пул потоков для эффективного управления ресурсами.

    ExecutorService executor = Executors.newFixedThreadPool(4);
    executor.submit(() -> {
        // Код задачи
    });
    executor.shutdown();
  3. CompletableFuture (Java 8+) — для асинхронного программирования и комбинирования задач.

    CompletableFuture.runAsync(() -> {
        // Асинхронная задача
    });

Ключевые моменты:

  • Синхронизация: Потоки, работающие с общими данными, требуют синхронизации (например, через synchronized, Lock или атомарные классы).
  • Обработка исключений: Исключения в потоке, не перехваченные внутри run(), приводят к завершению потока. Используйте UncaughtExceptionHandler.
  • Производительность:
    • Для CPU-bound задач оптимальное число потоков ≈ количеству ядер CPU.
    • Для IO-bound задач (сеть, диск) можно создавать больше потоков.