Получить доступ

Чем Thread, Runnable и Callable отличаются?

JuniorМногопоточность
Коротко

Thread — сам поток выполнения. Runnable — задача без результата (void run()), Callable<V> — задача с результатом V call(), которая может бросить проверяемое исключение.

  • Runnable и Callable описывают работу, а запускает её Thread или пул
  • Результат Callable получают через Future
  • Наследовать Thread ради задачи — плохая практика: смешивает «что» и «как»

А ещё Оба — функциональные интерфейсы, удобно писать лямбдами

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Thread — объект, управляющий потоком ОС (или виртуальным потоком): start, join, interrupt, имя, приоритет, daemon.

Runnable — описание задачи:

Runnable r = () -> System.out.println("работа");
new Thread(r).start();

Ничего не возвращает и не может бросить проверяемое исключение.

Callable<V> — задача с результатом:

Callable<Integer> c = () -> compute();
Future<Integer> f = executor.submit(c);
int result = f.get();   // ждёт и возвращает; исключение — в ExecutionException

Thread сам Callable не принимает — его отдают в ExecutorService или оборачивают в FutureTask.

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

Что хотят услышать

  • Роли трёх сущностей.
  • Результат и исключения у Callable, Future.
  • Почему задачу не делают наследником Thread.

Частые ошибки

  • Вызывать run() вместо start() и ждать новый поток.
  • Создавать неограниченное число Thread вручную.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Runnable — задача без результата (run); Callable — задача с результатом и исключением (call); Thread — сам поток выполнения
  • ✗Callable не возвращает результат, а Runnable возвращает
  • ✗Все три — это потоки выполнения
  • ✗Thread нельзя запустить без Callable

Что спросят дальше

  • Зачем нужен ExecutorService?
  • Чем Future отличается от CompletableFuture?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем