thanks for reporting @alugowski 

EpollEventLoopGroup missing Executor-based constructor
EpollEventLoop is sold as a drop-in replacement for NioEventLoop (at least on Linux), but EpollEventLoopGroup only has the ThreadFactory-based constructor, not the Executor-based constructor that NioEventLoopGroup also includes.

transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollEventLoopGroup.java
transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollEventLoopGroup.java
diff --git a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollEventLoopGroup.java b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollEventLoopGroup.java
index c151806c66b..6a7b3162bbf 100644
--- a/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollEventLoopGroup.java
+++ b/transport-native-epoll/src/main/java/io/netty/channel/epoll/EpollEventLoopGroup.java
@@ -15,8 +15,8 @@
  */
 package io.netty.channel.epoll;
 
-import io.netty.channel.EventLoop;
 import io.netty.channel.DefaultSelectStrategyFactory;
+import io.netty.channel.EventLoop;
 import io.netty.channel.EventLoopGroup;
 import io.netty.channel.MultithreadEventLoopGroup;
 import io.netty.channel.SelectStrategyFactory;
@@ -50,7 +50,7 @@ public EpollEventLoopGroup(int nThreads) {
      */
     @SuppressWarnings("deprecation")
     public EpollEventLoopGroup(int nThreads, SelectStrategyFactory selectStrategyFactory) {
-        this(nThreads, null, selectStrategyFactory);
+        this(nThreads, (ThreadFactory) null, selectStrategyFactory);
     }
 
     /**
@@ -61,6 +61,10 @@ public EpollEventLoopGroup(int nThreads, ThreadFactory threadFactory) {
         this(nThreads, threadFactory, 0);
     }
 
+    public EpollEventLoopGroup(int nThreads, Executor executor) {
+        this(nThreads, executor, DefaultSelectStrategyFactory.INSTANCE);
+    }
+
     /**
      * Create a new instance using the specified number of threads and the given {@link ThreadFactory}.
      */
@@ -93,6 +97,10 @@ public EpollEventLoopGroup(int nThreads, ThreadFactory threadFactory, int maxEve
         super(nThreads, threadFactory, maxEventsAtOnce, selectStrategyFactory);
     }
 
+    public EpollEventLoopGroup(int nThreads, Executor executor, SelectStrategyFactory selectStrategyFactory) {
+        super(nThreads, executor, 0, selectStrategyFactory);
+    }
+
     /**
      * Sets the percentage of the desired amount of time spent for I/O in the child event loops.  The default value is
      * {@code 50}, which means the event loop will try to spend the same amount of time for I/O as for non-I/O tasks.
