← Назад к вопросам

Как запустить поток в JVM на любом языке

2.0 Middle🔥 201 комментариев
#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как запустить поток в JVM на любом языке

Основные способы создания потока

В Java есть два основных способа создания потока — наследование класса Thread и реализация интерфейса Runnable.

1. Наследование Thread

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

MyThread thread = new MyThread();
thread.start();  // Запускаем поток

Этот подход прямолинейный, но имеет ограничение: класс уже наследует Thread и не может наследовать другой класс.

2. Реализация Runnable (рекомендуется)

class MyTask implements Runnable {
    @Override
    public void run() {
        System.out.println("Поток выполняется");
    }
}

Thread thread = new Thread(new MyTask());
thread.start();  // Запускаем поток

Это более гибкий подход, так как класс может реализовывать несколько интерфейсов и одновременно наследовать другой класс.

3. Lambda-выражение (современный способ)

С Java 8 можно использовать лямбда-выражения для более компактного кода:

Thread thread = new Thread(() -> {
    System.out.println("Поток выполняется");
});
thread.start();

ExecutorService (продвинутый подход)

Для управления несколькими потоками рекомендуется использовать ExecutorService:

ExecutorService executor = Executors.newFixedThreadPool(5);

for (int i = 0; i < 10; i++) {
    executor.execute(() -> {
        System.out.println("Задача выполняется в " + Thread.currentThread().getName());
    });
}

executor.shutdown();  // Завершить все потоки

Важные методы Thread

  • start() — запускает поток. ВАЖНО: нельзя вызывать run() напрямую, это выполнит код в текущем потоке.
  • run() — содержит код, который выполнится в новом потоке.
  • join() — ожидает завершения потока.
  • sleep(long millis) — приостанавливает поток на указанное время.
  • setPriority(int) — устанавливает приоритет (1-10).
  • setName(String) — устанавливает имя потока.

Жизненный цикл потока

  1. NEW — создан, но не запущен
  2. RUNNABLE — готов к выполнению
  3. RUNNING — выполняется
  4. WAITING/BLOCKED — ожидает или заблокирован
  5. TERMINATED — завершил работу

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

public class ThreadExample {
    public static void main(String[] args) {
        Runnable task = () -> {
            for (int i = 0; i < 5; i++) {
                System.out.println(Thread.currentThread().getName() + ": " + i);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        Thread thread1 = new Thread(task, "Поток-1");
        Thread thread2 = new Thread(task, "Поток-2");

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Все потоки завершены");
    }
}

Ключевые принципы

  • Всегда вызывайте start(), а не run()
  • Используйте Runnable вместо наследования Thread
  • Предпочитайте ExecutorService для управления пулом потоков
  • Обрабатывайте InterruptedException правильно
  • Помните о thread safety при доступе к общим ресурсам