Spring WebFlux does not assign a dedicated thread to every request, and reactive operators do not each start a thread. With a supported non-blocking server, requests are handled by a comparatively small event-loop worker pool. That model works well when application code uses non-blocking I/O; blocking a worker can stall other work that depends on it.
How WebFlux handles requests
Spring MVC is designed to accommodate request-handling code that may block, such as while waiting for a remote service. Servlet containers commonly use a larger request-thread pool so other requests can proceed while some threads are waiting. WebFlux instead assumes application work is non-blocking. A non-blocking server can use a small, fixed-size event-loop worker pool: when I/O is pending, the worker can handle other events rather than remain blocked for that operation. Spring Framework’s WebFlux overview explains this distinction.
This is not one thread for the entire server, nor a new thread for each request. Spring’s illustrative vanilla WebFlux server has one server thread and several request-processing threads, typically as many as CPU cores. That is a documentation example, not a universal configuration or a performance measurement. Servlet containers can have additional threads for their blocking and non-blocking APIs.
The concrete layout depends on the server, client connector, schedulers, and libraries in the application. WebFlux supports servers including Netty and servlet containers such as Tomcat and Jetty, while exposing a common programming model over those integrations. Spring Boot’s WebFlux starter defaults to Netty; check the documentation for the Spring Boot version you use before relying on that default.
#1 Best Overall
What happens to threads in a reactive pipeline?
A Reactor pipeline describes a sequence of processing stages; it does not imply a thread switch at every operator. In the absence of a scheduler change, work generally continues in the execution context established by the source or preceding stage. Reactor provides schedulers when work needs to run on a different pool. Spring’s overview describes a limited-thread strategy such as parallel for CPU-bound work and a more elastic strategy for I/O-bound work. Scheduler APIs and recommendations can vary by Reactor version, so use the version-specific Reactor documentation when choosing one.
Spring notes that application code in the described reactive pipeline is processed sequentially through distinct stages, which can reduce the need to guard mutable state against concurrent invocation within that pipeline. This is not a promise of application-wide thread safety: requests can overlap, libraries and callbacks can introduce concurrency, and changing schedulers changes the execution context.
WebClient and Reactor Netty resources
In a WebClient setup using Reactor Netty, the client uses an event-loop model. When a Reactor Netty client and server are used together, Spring says they share event-loop resources by default. The Spring WebClient configuration reference describes Reactor Netty global resources, including event-loop threads and a connection pool. That page is under the 7.0-SNAPSHOT documentation path, so verify lifecycle details against the stable Spring Framework version used by your application, especially if contexts start and stop in-process.
Reading thread names
Names such as reactor-http-nio- or names associated with a scheduler can help identify which pool is active when diagnosing a thread dump. A name alone does not establish that a handler is isolated from blocking work or that the application is non-blocking. Trace what the thread is doing and which code path is occupying it.
The Tool Desk
Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Rank #3
How to handle blocking work
A blocking database or network call is a poor fit on an event-loop worker because it occupies the thread that could otherwise process other events. Prefer non-blocking APIs throughout the request path. When a blocking dependency cannot be avoided, make the boundary explicit and run it on a separate executor or scheduler with capacity chosen for that dependency. Wrapping a blocking call in a reactive operator does not make the call itself non-blocking.
Blocking controller methods
Spring’s WebFlux configuration reference documents a controller mechanism for this case: a WebFluxConfigurer can provide an AsyncTaskExecutor for blocking controller execution. By default, methods whose return types are not recognized by the configured ReactiveAdapterRegistry are considered blocking for this mechanism; an application can customize that determination with a predicate. See the WebFlux configuration reference and confirm behavior for your Spring Framework version and configuration.
Rank #4
Return reactive results instead of waiting
When a controller composes a WebClient call, Spring advises against calling block() to wait for a Mono or Flux. Return the reactive type so the framework can continue the asynchronous request flow. In Kotlin, Spring recommends suspending functions or returning Flow. This guidance concerns controller request handling; it does not prohibit deliberately bridging to synchronous code at a clearly chosen boundary. See Spring’s synchronous WebClient guidance.
When WebFlux is a better fit than MVC
WebFlux is an architectural choice, not a general speed switch. Spring says non-blocking applications do not generally run faster simply because they are non-blocking. The potential benefit is handling workloads with latency, such as slow or unpredictable network I/O, with fewer threads and less memory when the application and its dependencies can use non-blocking operations. Those are expected advantages for suitable workloads, not guaranteed capacity or benchmark results.
Best Value
| Consideration | WebFlux is more compelling when… | MVC may be the simpler fit when… |
|---|---|---|
| Dependencies | The request path can use non-blocking database and network clients. | The application is centered on blocking APIs and would keep most work blocking even after a framework change. |
| Workload | Requests often wait on latency-prone I/O, and efficient concurrency matters. | The workload does not benefit materially from non-blocking I/O; WebFlux should not be adopted on the assumption that it makes code execute faster. |
| Resources | Reducing reliance on large numbers of blocked request threads is valuable. | The current thread and memory profile is adequate, and migration would add complexity without a demonstrated need. |
| Team and programming model | The team is prepared to work with reactive, declarative programming. | The learning curve and operational complexity outweigh the workload’s non-blocking requirements. |
WebFlux can call blocking APIs on separate threads, but that escape hatch does not make blocking dependencies a natural match for its event-loop model. The decision should follow the workload and the full dependency chain, not the assumption that reactive code is automatically faster.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

