Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: Java, Thread, run method, start method, multithreading, concurrency

В чем разница между run() и start()?

Вопрос проверяет понимание жизненного цикла потоков в Java и разницу между прямым вызовом метода run() и запуском потока через start().

Короткий ответ

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

Длинный ответ

В Java для работы с потоками используется класс Thread. У него есть два ключевых метода: run() и start(). Их часто путают, но они выполняют принципиально разные задачи.

Метод run()

Метод run() содержит код, который должен быть выполнен в новом потоке. Однако, если вызвать run() напрямую, например, myThread.run(), то этот код выполнится в том же потоке, из которого был сделан вызов (обычно в основном потоке приложения). Никакого нового потока при этом не создаётся. Это просто обычный вызов метода объекта.

Метод start()

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

Практический пример

Рассмотрим простой класс, расширяющий Thread:

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Выполняется в потоке: " + Thread.currentThread().getName());
    }
}

public class Main {
    public static void main(String[] args) {
        MyThread t = new MyThread();
        
        // Неправильно: выполнится в main
        t.run(); // Вывод: "Выполняется в потоке: main"
        
        // Правильно: запускает новый поток
        t.start(); // Вывод: "Выполняется в потоке: Thread-0"
    }
}

Как видно из вывода, прямой вызов run() выполняется в основном потоке main, а вызов start() создаёт и запускает новый поток с именем Thread-0.

Где это применяется?

Это фундаментальное знание необходимо для любого многопоточного программирования на Java. Понимание разницы критично для:

  • Создания отзывчивых приложений, где длительные операции не блокируют UI.
  • Реализации параллельных вычислений для ускорения обработки данных.
  • Построения серверных приложений, обрабатывающих множество клиентов одновременно.

Итог: Всегда используйте start() для запуска нового потока выполнения. Метод run() предназначен для переопределения логики потока, а не для его запуска. Прямой вызов run() лишает многопоточность смысла, так как код выполняется последовательно.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • Java

    Java

Ключевые слова

#Java

#Thread

#run method

#start method

#multithreading

#concurrency

Подпишись на Java Developer в телеграм