[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-reactive-chto-takoe-scheduler-v-project-reactor-kakie-tipy-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":15,"progress":16,"seo":17},996,"chto-takoe-scheduler-v-project-reactor-kakie-tipy-sushchestvuyut",31,"reactive","Reactive","⚡","Что такое Scheduler в Project Reactor? Какие типы существуют?","Scheduler — абстракция в Project Reactor, определяющая, в каком потоке (или пуле потоков) будет выполняться реактивный конвейер. По умолчанию цепочка выполняется в потоке, который вызвал `subscribe()`.\n\n### Два ключевых оператора\n\n| Оператор | Поведение |\n|----------|-----------|\n| `subscribeOn(Scheduler)` | Определяет поток для всей цепочки с начала (upstream). Место вызова не важно |\n| `publishOn(Scheduler)` | Переключает выполнение последующих операторов (downstream). Место вызова важно |\n\n```java\nFlux.range(1, 10)\n    .map(i -> {\n        System.out.println(\"map1: \" + Thread.currentThread().getName());\n        return i * 2;\n    })\n    .publishOn(Schedulers.parallel())\n    .map(i -> {\n        System.out.println(\"map2: \" + Thread.currentThread().getName());\n        return i + 1;\n    })\n    .subscribeOn(Schedulers.boundedElastic())\n    .subscribe();\n\u002F\u002F map1 выполнится в boundedElastic, map2 — в parallel\n```\n\n### Типы Scheduler\n\n| Scheduler | Пул потоков | Назначение |\n|-----------|-------------|------------|\n| `Schedulers.immediate()` | Текущий поток | Без переключения |\n| `Schedulers.single()` | 1 поток | Последовательные задачи с малой нагрузкой |\n| `Schedulers.parallel()` | N потоков (N = CPU cores) | CPU-bound вычисления, без блокировок |\n| `Schedulers.boundedElastic()` | Эластичный пул (до 10xCPU, TTL 60с) | Блокирующие I\u002FO (JDBC, файлы, legacy API) |\n| `Schedulers.fromExecutor(executor)` | Пользовательский Executor | Кастомный пул потоков |\n\n\u003Cdetails>\u003Csummary>Пример: оборачивание блокирующего вызова\u003C\u002Fsummary>\n\n```java\nMono\u003CUser> user = Mono.fromCallable(() -> {\n        \u002F\u002F Блокирующий вызов к БД через JDBC\n        return jdbcTemplate.queryForObject(\"SELECT * FROM users WHERE id = ?\",\n                                            userRowMapper, userId);\n    })\n    .subscribeOn(Schedulers.boundedElastic()); \u002F\u002F выполнить в эластичном пуле\n```\n\n\u003C\u002Fdetails>\n\n### Частые ошибки\n\n- Блокирующие вызовы в `Schedulers.parallel()` — приводит к голоданию потоков (пул ограничен числом CPU-ядер)\n- Многократный `subscribeOn` — работает только ближайший к источнику, остальные игнорируются\n- Отсутствие `subscribeOn` при блокирующем источнике — блокирующий вызов выполнится в event-loop потоке Netty\n- Создание нового Scheduler на каждый запрос — утечка потоков; используйте `Schedulers.*` или кэшируйте\n\n### Как используется в 2026\n\n- С Virtual Threads (Java 21) потребность в `boundedElastic()` для I\u002FO снижается\n- Reactor 3.6+ поддерживает `Schedulers.fromExecutor(Executors.newVirtualThreadPerTaskExecutor())`\n- Для CPU-bound вычислений `Schedulers.parallel()` остаётся актуальным\n- В полностью реактивных приложениях (R2DBC, WebClient) Scheduler нужен реже\n\n> **На собеседовании:** ключевое — объяснить разницу subscribeOn vs publishOn и назвать типы Scheduler с их назначением. Частая ошибка — не знать, что subscribeOn действует на весь upstream (место вызова не важно), а publishOn — только на downstream (место вызова критично).","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Что такое Scheduler в Project Reactor? Какие типы существуют — Gymterview","Scheduler — абстракция в Project Reactor, определяющая, в каком потоке (или пуле потоков) будет выполняться реактивный конвейер. По умолчанию цепочка выполняетс","Scheduler — абстракция в Project Reactor, определяющая, в каком потоке (или пуле потоков) будет выполняться реактивный к",[7,13],"Scheduler — абстракция в Project Reactor, определяющая, в каком потоке (или пуле потоков) будет выполняться реактивный конвейер. По умолчанию цепочка выполняется в потоке, который вызвал `subscribe()`.",true]