Короткий ответ
Процесс — это программа в состоянии выполнения с собственным изолированным адресным пространством памяти. Поток — «лёгковесная» единица выполнения внутри процесса; в Java сам процесс — это запущенная JVM, внутри которой работают десятки потоков: main, потоки сборщика мусора, пользовательские потоки.
Как это работает подробнее
Потоки одного процесса разделяют кучу и другие общие области памяти, поэтому могут общаться через общие объекты и переменные, но при этом каждый имеет собственный стек вызовов и программный счётчик — локальные переменные у потоков не общие. Из-за разделяемой памяти и возникает риск гонок за данные.
Процессы полностью изолированы: крах одного процесса не «роняет» другой, однако обмен данными между ними требует специальных механизмов — сокетов, файлов, разделяемой памяти. Создание и переключение потоков обходятся заметно дешевле, чем у процессов, поэтому многопоточность эффективнее использует ресурсы системы и многоядерные процессоры.
Пример кода
public class ThreadVsProcess {
public static void main(String[] args) {
// main и worker-потоки живут в одном процессе JVM
Runnable task = () -> System.out.println(Thread.currentThread().getName());
new Thread(task, "worker-1").start();
new Thread(task, "worker-2").start();
}
}Что использовать на практике
- Потоки — для параллельных задач внутри одного приложения: разделяемая память даёт быстрый обмен данными, но требует синхронизации.
- Процессы — когда нужна жёсткая изоляция и устойчивость к сбоям; коммуникация через сокеты или файлы дороже и сложнее.
Подводные камни
- Потоки разделяют кучу, поэтому общие изменяемые данные без синхронизации порождают гонки за данными.
- Стек и локальные переменные у потоков свои — «общими» они не становятся.
- Переключение контекста не бесплатно: избыток потоков может дать больше накладных расходов, чем пользы.
Как отвечать на собеседовании
- Определи процесс → определи поток → главное различие — память: общая куча против изолированного адресного пространства → добавь про собственный стек потока → сравни стоимость создания и переключения → пример: JVM-процесс с потоками main, GC и пользовательскими.