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

Что делает объект с интерфейсом Runnable?

2.0 Middle🔥 121 комментариев
#Многопоточность

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

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

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

Интерфейс Runnable в Java

Runnable — это функциональный интерфейс, который определяет задачу, которая может быть выполнена в отдельном потоке. Это основной способ создания многопоточного кода в Java.

Основное назначение

Объект с интерфейсом Runnable:

  • Представляет код, который должен быть выполнен в потоке
  • Не возвращает результат (метод run() возвращает void)
  • Может выбросить исключение, но только непроверяемое
  • Используется для асинхронных операций: IO операции, обработка данных, таймеры и т.д.

Сигнатура метода

Интерфейс Runnable содержит единственный метод:

public interface Runnable {
    void run();
}

Метод run() — это точка входа для кода, который выполнится в потоке.

Способы использования

1. Реализация через класс

class MyTask implements Runnable {
    @Override
    public void run() {
        System.out.println("Выполняется в потоке: " + Thread.currentThread().getName());
        for (int i = 0; i < 5; i++) {
            System.out.println("Итерация " + i);
        }
    }
}

// Использование
Thread thread = new Thread(new MyTask());
thread.start();  // Запускает код в отдельном потоке

2. Лямбда-выражение (Java 8+)

Thread thread = new Thread(() -> {
    System.out.println("Выполняется в потоке: " + Thread.currentThread().getName());
    for (int i = 0; i < 5; i++) {
        System.out.println("Итерация " + i);
    }
});
thread.start();

3. ExecutorService (рекомендуемый подход)

ExecutorService executor = Executors.newFixedThreadPool(2);

executor.execute(() -> {
    System.out.println("Задача 1 выполняется");
});

executor.execute(() -> {
    System.out.println("Задача 2 выполняется");
});

executor.shutdown();  // Ожидает завершения всех задач

Ограничения Runnable

Проблема: Runnable не возвращает результат. Это часто неудобно для асинхронных операций, где нужен результат вычисления:

// ❌ Runnable не может вернуть результат
Runnable task = () -> {
    int result = 42;
    // Как вернуть result?
};

Альтернатива: Callable

Для задач, которые должны возвращать результат, используется Callable:

Callable<Integer> task = () -> {
    System.out.println("Выполняется вычисление...");
    return 42;  // Возвращает результат
};

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(task);

try {
    Integer result = future.get();  // Получить результат (блокирует поток)
    System.out.println("Результат: " + result);
} catch (ExecutionException e) {
    e.printStackTrace();
}

Практический пример: многопоточная загрузка файлов

class FileDownloadTask implements Runnable {
    private String fileName;
    
    public FileDownloadTask(String fileName) {
        this.fileName = fileName;
    }
    
    @Override
    public void run() {
        try {
            System.out.println("Начало загрузки: " + fileName);
            // Имитация длительной операции
            Thread.sleep(2000);
            System.out.println("Завершена загрузка: " + fileName);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

// Использование
public static void main(String[] args) {
    ExecutorService executor = Executors.newFixedThreadPool(3);
    
    executor.execute(new FileDownloadTask("file1.zip"));
    executor.execute(new FileDownloadTask("file2.pdf"));
    executor.execute(new FileDownloadTask("file3.doc"));
    
    executor.shutdown();
}

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

  • Runnable — функциональный интерфейс с методом run()
  • Используется с Thread для создания многопоточности
  • ExecutorService — современный и безопасный способ использования
  • Callable — альтернатива для задач, требующих возврата результата
  • Исключения: только непроверяемые, проверяемые нужно обрабатывать внутри run()

Этот интерфейс является фундаментом многопоточного программирования в Java и остаётся актуальным даже с появлением современных инструментов вроде Project Loom (виртуальные потоки).