diff --git a/common/src/main/java/io/netty/util/concurrent/SingleThreadEventExecutor.java b/common/src/main/java/io/netty/util/concurrent/SingleThreadEventExecutor.java
index <HASH>..<HASH> 100644
--- a/common/src/main/java/io/netty/util/concurrent/SingleThreadEventExecutor.java
+++ b/common/src/main/java/io/netty/util/concurrent/SingleThreadEventExecutor.java
@@ -800,16 +800,19 @@ public abstract class SingleThreadEventExecutor extends AbstractEventExecutor {
                         setSuccessInternal(result);
                     }
                 } else {
-                    task.call();
-                    if (!executor().isShutdown()) {
-                        long p = periodNanos;
-                        if (p > 0) {
-                            deadlineNanos += p;
-                        } else {
-                            deadlineNanos = nanoTime() - p;
-                        }
-                        if (!isDone()) {
-                            executor().delayedTaskQueue.add(this);
+                    // check if is done as it may was cancelled
+                    if (!isDone()) {
+                        task.call();
+                        if (!executor().isShutdown()) {
+                            long p = periodNanos;
+                            if (p > 0) {
+                                deadlineNanos += p;
+                            } else {
+                                deadlineNanos = nanoTime() - p;
+                            }
+                            if (!isDone()) {
+                                executor().delayedTaskQueue.add(this);
+                            }
                         }
                     }
                 }
Make sure cancelled scheduled tasks will not run again if cancelled before