[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-v-chyom-zaklyuchaetsya-razlichie-mezhdu-metodami-submit-i-execute-u-pula-potokov":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":21,"progress":22,"seo":23},268,"v-chyom-zaklyuchaetsya-razlichie-mezhdu-metodami-submit-i-execute-u-pula-potokov",8,"mnogopotochnost","Многопоточность","🔀","В чём заключается различие между методами submit() и execute() у пула потоков?","\u003C!-- grade: 4\u002F5 — различия описаны, но нет примера и не раскрыта обработка исключений -->\n\nОба метода используются для подачи задач в пул потоков, но различаются по интерфейсу, возвращаемому значению и обработке исключений.\n\n### Сравнение\n\n| Характеристика | `execute(Runnable)` | `submit(...)` |\n|---|---|---|\n| Определён в | `Executor` | `ExecutorService` |\n| Принимает | Только `Runnable` | `Runnable`, `Callable\u003CV>`, `Runnable + result` |\n| Возвращает | `void` | `Future\u003CV>` |\n| Обработка исключений | Непойманное исключение вызывает `UncaughtExceptionHandler`; поток завершается и заменяется новым | Исключение сохраняется в `Future`; при вызове `get()` выбрасывается `ExecutionException` |\n\n### Сигнатуры\n\n```java\n\u002F\u002F Executor\nvoid execute(Runnable command);\n\n\u002F\u002F ExecutorService\nFuture\u003C?> submit(Runnable task);\nFuture\u003CV> submit(Callable\u003CV> task);\nFuture\u003CV> submit(Runnable task, V result);\n```\n\n### Критическое различие: обработка исключений\n\nЭто самое важное практическое различие:\n\n\u003Cdetails>\n\u003Csummary>Пример: разная обработка исключений\u003C\u002Fsummary>\n\n```java\nExecutorService executor = Executors.newSingleThreadExecutor();\n\n\u002F\u002F execute() — исключение «видно» в консоли\nexecutor.execute(() -> {\n    throw new RuntimeException(\"Ошибка в execute()\");\n    \u002F\u002F Стек-трейс напечатается в System.err\n    \u002F\u002F Поток пула завершится и будет заменён новым\n});\n\n\u002F\u002F submit() — исключение «прячется» в Future\nFuture\u003C?> future = executor.submit(() -> {\n    throw new RuntimeException(\"Ошибка в submit()\");\n    \u002F\u002F Ничего не напечатается! Исключение «спрятано»\n});\n\ntry {\n    future.get(); \u002F\u002F ExecutionException с причиной RuntimeException\n} catch (ExecutionException e) {\n    System.err.println(\"Поймали: \" + e.getCause().getMessage());\n}\n\nexecutor.shutdown();\n```\n\n\u003C\u002Fdetails>\n\n### Когда что использовать\n\n| Сценарий | Рекомендация |\n|---|---|\n| «Забыл и забил» (fire-and-forget) | `execute()` -- проще, исключения видны сразу |\n| Нужен результат вычисления | `submit(Callable)` -- получите результат через `Future.get()` |\n| Нужно отменить задачу | `submit()` -- вернёт `Future`, у которого есть `cancel()` |\n| Нужно дождаться завершения | `submit()` -- `Future.get()` блокирует до завершения |\n\n### Опасность submit() без get()\n\n```java\n\u002F\u002F ОПАСНО: исключение потеряно навсегда!\nexecutor.submit(() -> {\n    processPayment(); \u002F\u002F Если тут исключение — никто не узнает\n});\n\n\u002F\u002F БЕЗОПАСНО: исключение будет обработано\nFuture\u003C?> future = executor.submit(() -> processPayment());\nfuture.get(); \u002F\u002F Выбросит ExecutionException если processPayment() упал\n```\n\n> **Аналогия из жизни.** `execute()` -- вы отправили письмо обычной почтой: если что-то пошло не так, вам пришлют уведомление о недоставке. `submit()` -- вы отправили письмо с уведомлением о вручении (`Future`): вы точно узнаете результат, но только если проверите уведомление (`get()`). Если не проверите -- не узнаете ни об успехе, ни об ошибке.\n\n> **На собеседовании.** Основной акцент на обработке исключений: (1) `execute()` -- исключение передаётся в `UncaughtExceptionHandler`, видно в логах; (2) `submit()` -- исключение «прячется» в `Future`, и если не вызвать `get()`, баг останется незамеченным. Это частый источник скрытых ошибок в production. Рекомендация: если используете `submit()` без `get()`, оберните задачу в try-catch с логированием.","","middle",[15,16,17,18,19,20],"Executor","submit","ExecutorService","Future","execute","concurrency",[],null,{"title":24,"description":25,"ogTitle":26,"ogDescription":27,"keywords":28,"schemaAnswer":33,"featuredSnippetReady":34},"submit() vs execute() в пуле потоков Java — Gymterview","execute(Runnable) — из Executor, ничего не возвращает. submit() — из ExecutorService, принимает Runnable\u002FCallable и возвращает Future для контроля выполнения.","submit() vs execute() — возвращает ли пул результат?","execute() определён в Executor — ничего не возвращает. submit() из ExecutorService — возвращает Future для контроля и получения результата.",[29,30,31,32],"submit vs execute Java","ExecutorService submit","Executor execute","Future submit Java","execute(Runnable) определён в интерфейсе Executor, выполняет задачу и ничего не возвращает. submit() определён в ExecutorService, принимает Runnable или Callable и возвращает объект Future для контроля выполнения и получения результата.",true]