Что представляет собой интерфейс Runnable в Java?

«Что представляет собой интерфейс Runnable в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Runnable — это функциональный интерфейс в Java, представляющий задачу, которую можно выполнить асинхронно, обычно в отдельном потоке. Он содержит единственный абстрактный метод void run().

Основное назначение: Отделение логики задачи от механизма её выполнения (потока Thread).

Синтаксис и примеры:

// 1. Классическая реализация через анонимный класс
Runnable task1 = new Runnable() {
    @Override
    public void run() {
        System.out.println("Task 1 is running.");
    }
};

// 2. Реализация через лямбда-выражение (Java 8+)
Runnable task2 = () -> {
    for (int i = 0; i < 3; i++) {
        System.out.println("Task 2, iteration: " + i);
    }
};

// 3. Запуск задачи в новом потоке
Thread thread = new Thread(task2);
thread.start();

Основные способы выполнения:

  1. Через класс Thread: new Thread(runnableTask).start().
  2. Через ExecutorService (рекомендуемый способ):
    ExecutorService executor = Executors.newFixedThreadPool(2);
    executor.submit(task1); // Передаем Runnable на выполнение в пул
    executor.shutdown();
Ключевые отличия от Callable<V>: Runnable Callable<V>
Метод void run() не возвращает результат. Метод V call() возвращает результат типа V.
Не может выбрасывать проверяемые исключения (throws). Может выбрасывать проверяемые исключения.
Используется с ExecutorService.submit(Runnable). Используется с ExecutorService.submit(Callable), возвращает Future<V>.

Практическое правило: Используйте Runnable для задач, которые не требуют возврата результата, и Callable — когда результат нужен. Для управления потоками всегда предпочитайте ExecutorService прямому созданию Thread.