Skip to content

Executor pattern implementations

The Executor pattern provides a standardized interface for decoupling task submission from task execution, allowing developers to define how, when, and where runnable tasks are processed without managing the underlying thread lifecycle directly^[600-developer-big-data-netty-netty-eventloopgroup.md].

At its core, the pattern relies on the java.util.concurrent.Executor Functional Interface, which mandates a single execute(Runnable command) method^[600-developer-big-data-netty-netty-eventloopgroup.md]. This abstraction supports a wide range of execution strategies, from synchronous method calls to complex asynchronous thread pooling^[600-developer-big-data-netty-netty-eventloopgroup.md].

Implementation strategies

The Executor pattern can be implemented with various strategies to control task execution semantics^[600-developer-big-data-netty-netty-eventloopgroup.md]:

  • Direct Execution: A "Direct Executor" runs the task immediately in the caller's thread, invoking r.run() directly. This is useful for immediate execution or when thread safety is managed externally^[600-developer-big-data-netty-netty-eventloopgroup.md].
  • Thread Per Task: A "Thread Per Task Executor" spawns a new thread for every command. This ensures each task runs independently but can incur high overhead due to frequent thread creation^[600-developer-big-data-netty-netty-eventloopgroup.md].
  • Serial Execution: A "Serial Executor" maintains an internal queue (e.g., ArrayDeque) to ensure that tasks submitted to it are executed sequentially by a secondary executor, typically to enforce ordering or concurrency limits^[600-developer-big-data-netty-netty-eventloopgroup.md].

Framework integration

Many high-performance frameworks implement this pattern to manage their own concurrency models.

  • Netty: In the Netty networking framework, the EventExecutor and EventLoopGroup hierarchies extend the standard Executor concept^[600-developer-big-data-netty-netty-eventloopgroup.md]. Specific implementations include:
    • NioEventLoopGroup: Used for non-blocking I/O operations^[600-developer-big-data-netty-netty-eventloopgroup.md].
    • SingleThreadEventExecutor: Handles tasks on a single dedicated thread^[600-developer-big-data-netty-netty-eventloopgroup.md].
    • DefaultEventLoopGroup: A generic utility group^[600-developer-big-data-netty-netty-eventloopgroup.md].

Sources

^[600-developer-big-data-netty-netty-eventloopgroup.md]