diff options
Diffstat (limited to 'src/main/java/de/pixart/messenger/utils')
-rw-r--r-- | src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java | 7 | ||||
-rw-r--r-- | src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java | 37 |
2 files changed, 35 insertions, 9 deletions
diff --git a/src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java b/src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java index 7bd33eff4..bf4d6e8c2 100644 --- a/src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java +++ b/src/main/java/de/pixart/messenger/utils/ReplacingSerialSingleThreadExecutor.java @@ -18,4 +18,11 @@ public class ReplacingSerialSingleThreadExecutor extends SerialSingleThreadExecu } super.execute(r); } + + public synchronized void cancelRunningTasks() { + tasks.clear(); + if (active != null && active instanceof Cancellable) { + ((Cancellable) active).cancel(); + } + } } diff --git a/src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java b/src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java index 1a1280d5a..500b03c5b 100644 --- a/src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java +++ b/src/main/java/de/pixart/messenger/utils/SerialSingleThreadExecutor.java @@ -11,10 +11,10 @@ import de.pixart.messenger.Config; public class SerialSingleThreadExecutor implements Executor { + final ArrayDeque<Runnable> tasks = new ArrayDeque<>(); private final Executor executor = Executors.newSingleThreadExecutor(); - final ArrayDeque<Runnable> tasks = new ArrayDeque<>(); - protected Runnable active; private final String name; + protected Runnable active; public SerialSingleThreadExecutor(String name) { this(name, false); @@ -28,13 +28,7 @@ public class SerialSingleThreadExecutor implements Executor { } public synchronized void execute(final Runnable r) { - tasks.offer(() -> { - try { - r.run(); - } finally { - scheduleNext(); - } - }); + tasks.offer(new Runner(r)); if (active == null) { scheduleNext(); } @@ -49,4 +43,29 @@ public class SerialSingleThreadExecutor implements Executor { } } } + + private class Runner implements Runnable, Cancellable { + + private final Runnable runnable; + + private Runner(Runnable runnable) { + this.runnable = runnable; + } + + @Override + public void cancel() { + if (runnable instanceof Cancellable) { + ((Cancellable) runnable).cancel(); + } + } + + @Override + public void run() { + try { + runnable.run(); + } finally { + scheduleNext(); + } + } + } }
\ No newline at end of file |