В чем разница между многопоточностью и параллелизмом в программировании?

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

Ответ

Многопоточность (Multithreading) — это модель выполнения, при которой в рамках одного процесса создаются и выполняются несколько потоков. Эти потоки могут выполняться последовательно (чередуясь на одном ядре процессора) или параллельно (если позволяет аппаратное обеспечение).

Параллелизм (Parallelism) — это фактическое одновременное выполнение нескольких задач на разных ядрах или процессорах. Параллелизм требует многопоточности или мультипроцессинга.

Ключевое отличие:

  • Многопоточность — это абстракция, модель программирования (управление потоками).
  • Параллелизм — это состояние выполнения, зависящее от железа (одновременная работа).

Пример на Java:

// Многопоточность (потоки могут выполняться последовательно или параллельно)
Thread t1 = new Thread(() -> System.out.println("Thread 1"));
Thread t2 = new Thread(() -> System.out.println("Thread 2"));
t1.start();
t2.start();

// Параллелизм (явное создание пула потоков для параллельного выполнения на нескольких ядрах)
import java.util.concurrent.*;
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(() -> System.out.println("Task 1"));
executor.submit(() -> System.out.println("Task 2"));
executor.shutdown();

Таким образом, многопоточность может существовать и на одном ядре (псевдопараллелизм), а параллелизм — это частный случай многопоточности при наличии нескольких вычислительных единиц.