Mediumexecutor-service

Чем submit отличается от execute в ExecutorService?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

execute(Runnable) — из Executor, не возвращает результат, исключения внутри обрабатываются UncaughtExceptionHandler (по умолчанию stderr и поток умирает). submit(Runnable/Callable) — из ExecutorService, возвращает Future, исключения сохраняются внутри и выбрасываются при future.get().

executor.execute(() -> doWork());              // без результата

Future<Integer> f = executor.submit(() -> 42); // с результатом
try {
    Integer r = f.get(1, TimeUnit.SECONDS);    // блокирует с timeout
} catch (ExecutionException e) {              // оборачивает исключение задачи
    log.error(e.getCause());
}
f.cancel(true);   // отменить, может прервать
  • submit предпочтительнее: результат, обработка исключений в caller, возможность cancel;
  • invokeAll(coll) — список Future, ждёт все; invokeAny(coll) — первый успешный;
  • Не забывать shutdown() — иначе JVM не завершится (non-daemon потоки пула живы).

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.