Sobes.tech
Назад к вопросам
Junior — Middle
54

Как соотносятся понятия потока оси и легковесного потока в контексте многопоточности?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Поток ОС — это сущность, которую планирует операционная система, с собственным стеком и состоянием выполнения. Легковесный поток — это, как правило, Java-поток на уровне JVM, который отображается на поток ОС и выполняет код параллельно с другими. На практике в классической модели Java Thread почти всегда соответствует одному потоку ОС.

Определение:

Поток ОС — это системный поток, управляемый ядром операционной системы. Он может исполняться независимо и конкурировать за процессор с другими потоками.

Легковесный поток — это более “высокоуровневая” абстракция потока, обычно имеющая меньшую стоимость создания и переключения по сравнению с процессом. В Java в традиционной модели java.lang.Thread — это поток, который обычно маппится на нативный поток ОС. Поэтому соотношение такое: один Java-поток обычно соответствует одному потоку ОС, а “легковесность” означает, что поток дешевле процесса, но всё равно не бесплатен.

Пример использования:

Если сервер обрабатывает запросы в нескольких потоках, каждый запрос может выполняться в отдельном Thread. JVM создаст нативные потоки ОС, и планировщик ОС будет распределять их по ядрам процессора.

public class App {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> System.out.println("Task 1"));
        Thread t2 = new Thread(() -> System.out.println("Task 2"));

        t1.start();
        t2.start();
    }
}

Пояснение кода:

Код показывает два Java-потока. При вызове start() JVM создаёт и запускает соответствующие нативные потоки ОС. Метод run() в виде лямбды содержит полезную работу, а реальное параллельное выполнение происходит именно после start(), а не при прямом вызове run().

Шаги выполнения:

  1. Создаются два объекта Thread.
  2. Для каждого задаётся задача через лямбду.
  3. Вызов start() переводит поток в состояние исполнения.
  4. Планировщик ОС решает, на каком ядре и когда выполнять каждый поток.
  5. Оба задания могут выполниться параллельно или псевдопараллельно, в зависимости от числа ядер и загрузки системы.

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

  • Поток ОС — это сущность уровня операционной системы.
  • Легковесный поток — это поток, который дешевле процесса, но всё равно требует ресурсов.
  • В классической Java-модели Thread обычно соответствует нативному потоку ОС.
  • Переключение между потоками дешевле, чем между процессами, но не бесплатно.
  • Параллелизм в Java-Thread ограничен возможностями ОС и количеством ядер.
  • start() запускает новый поток, а run() сам по себе новый поток не создаёт.