[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mnogopotochnost-chto-takoe-asinkhronnoe-programmirovanie-v-java-i-kakie-osnovnye-patterny-sushchestvuyut":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":22,"progress":23,"seo":24},295,"chto-takoe-asinkhronnoe-programmirovanie-v-java-i-kakie-osnovnye-patterny-sushchestvuyut",8,"mnogopotochnost","Многопоточность","🔀","Что такое асинхронное программирование в Java и какие основные паттерны существуют?","\u003C!-- grade: 5\u002F5 — отличный обзор паттернов с примерами -->\n\n**Асинхронное программирование** — это подход, при котором задачи, не требующие немедленного результата (сетевые запросы, обращения к БД, файловый ввод-вывод), выполняются **без блокировки вызывающего потока**. Вместо ожидания завершения поток может выполнять другую работу.\n\n**Основные паттерны:**\n\n**1. Callback (обратный вызов)** — самый ранний подход\n\n\u003Cdetails>\n\u003Csummary>Код: паттерн Callback\u003C\u002Fsummary>\n\n```java\ninterface AsyncCallback\u003CT> {\n    void onSuccess(T result);\n    void onFailure(Exception ex);\n}\n\nvoid fetchDataAsync(String url, AsyncCallback\u003CString> callback) {\n    new Thread(() -> {\n        try {\n            String result = doHttpRequest(url);\n            callback.onSuccess(result);\n        } catch (Exception e) {\n            callback.onFailure(e);\n        }\n    }).start();\n}\n\n\u002F\u002F Использование\nfetchDataAsync(\"https:\u002F\u002Fapi.example.com\", new AsyncCallback\u003C>() {\n    @Override\n    public void onSuccess(String result) { System.out.println(result); }\n    @Override\n    public void onFailure(Exception ex) { ex.printStackTrace(); }\n});\n```\n\n\u003C\u002Fdetails>\n\nПроблема: при вложении нескольких асинхронных вызовов возникает «callback hell» — код становится нечитаемым.\n\n**2. Future\u002FPromise** — объект-представление будущего результата\n\n```java\n\u002F\u002F Future (Java 5) — только блокирующее получение\nFuture\u003CString> future = executor.submit(() -> fetchData());\nString result = future.get(); \u002F\u002F блокирует текущий поток\n\n\u002F\u002F CompletableFuture (Java 8) — неблокирующие цепочки\nCompletableFuture.supplyAsync(() -> fetchData())\n    .thenApply(data -> parse(data))\n    .thenAccept(parsed -> save(parsed))\n    .exceptionally(ex -> { log.error(ex); return null; });\n```\n\n**3. Реактивные потоки (Reactive Streams)** — Publisher-Subscriber с backpressure\n\n```java\nFlux.fromIterable(userIds)\n    .flatMap(id -> webClient.get().uri(\"\u002Fusers\u002F\" + id)\n        .retrieve().bodyToMono(User.class))\n    .filter(User::isActive)\n    .collectList()\n    .subscribe(users -> processUsers(users));\n```\n\nРеализации: Project Reactor, RxJava, Java 9 `Flow` API.\n\n**4. Async\u002FAwait через Virtual Threads (Java 21)**\n\nСинхронный по виду код, который работает асинхронно за счёт дешёвого переключения виртуальных потоков:\n\n```java\ntry (var executor = Executors.newVirtualThreadPerTaskExecutor()) {\n    Future\u003CString> user = executor.submit(() -> fetchUser(id));\n    Future\u003CString> orders = executor.submit(() -> fetchOrders(id));\n    System.out.println(user.get() + \" : \" + orders.get());\n}\n```\n\n**5. Event Loop (цикл событий)** — один поток обрабатывает события из очереди\n\n```java\nVertx vertx = Vertx.vertx();\nvertx.createHttpServer()\n    .requestHandler(req -> req.response().end(\"Hello\"))\n    .listen(8080);\n```\n\nИспользуется в Vert.x, Netty.\n\n**Выбор паттерна:**\n\n| Задача | Рекомендуемый паттерн |\n|---|---|\n| Единичные асинхронные вызовы | `CompletableFuture` |\n| Потоки данных с backpressure | Reactive Streams |\n| Высоконагруженные серверы | Event Loop или Virtual Threads |\n| Простые IO-bound задачи (Java 21+) | Virtual Threads |\n| Оркестрация нескольких параллельных задач | `CompletableFuture` или Structured Concurrency |\n\n**Ключевые ошибки:**\n- Смешивание блокирующего и асинхронного кода (`future.get()` внутри реактивной цепочки).\n- Отсутствие обработки ошибок в асинхронных цепочках — исключения теряются.\n- Чрезмерное усложнение: реактивные потоки там, где достаточно Virtual Threads.\n- Отсутствие таймаутов — утечка ресурсов.\n\n> **Аналогия:** представьте ресторан. Callback — это когда официант стоит у кухни и ждёт ваше блюдо. Future — вы взяли номерок и сидите за столом. Reactive — конвейер суши, где блюда едут к вам автоматически с контролем скорости. Virtual Threads — у вас миллион официантов, каждый обслуживает одного клиента, но стоить это как десять.\n\n> **На собеседовании** важно показать понимание: асинхронность != параллелизм. Асинхронность может быть реализована в одном потоке (Event Loop). Тренд 2024-2026 — переход от реактивных фреймворков к Virtual Threads для IO-bound задач.","","middle",[15,16,17,18,19,20,21],"Callback","реактивные-потоки","Future","асинхронность","Event-Loop","Virtual-Threads","concurrency",[],null,{"title":25,"description":26,"ogTitle":27,"ogDescription":28,"keywords":29,"schemaAnswer":35,"featuredSnippetReady":36},"Асинхронное программирование в Java — 5 паттернов — Gymterview","Основные паттерны: Callback, Future\u002FPromise, Reactive Streams, Async\u002FAwait через Virtual Threads, Event Loop. Выбор зависит от задачи.","5 паттернов асинхронного программирования в Java","Callback, Future\u002FPromise, Reactive Streams, Virtual Threads (async\u002Fawait), Event Loop — обзор паттернов с примерами кода.",[30,31,32,33,34],"асинхронное программирование Java","паттерны асинхронности","Callback Java","Reactive Streams","Virtual Threads async","Асинхронное программирование — выполнение задач без блокировки вызывающего потока. Паттерны: 1) Callback — обратный вызов (проблема callback hell), 2) Future\u002FPromise — CompletableFuture с цепочками, 3) Reactive Streams — Publisher-Subscriber с backpressure, 4) Async\u002FAwait через Virtual Threads (Java 21) — синхронный код, работающий асинхронно, 5) Event Loop — один поток обрабатывает события (Vert.x, Netty).",true]