diff options
author | Daniel Gultsch <daniel@gultsch.de> | 2015-06-23 12:15:18 +0200 |
---|---|---|
committer | Daniel Gultsch <daniel@gultsch.de> | 2015-06-23 12:15:18 +0200 |
commit | 2dd16a8b56e7755582b2f195fd86deb1ea77252d (patch) | |
tree | 97342ad18be891ee0d4adfd45d19fd63bdc74e10 /src/main/java/eu/siacs/conversations/utils/SerialSingleThreadExecutor.java | |
parent | 9b7a606cb03bbaf36fc691f02ef32ab9c158de6d (diff) | |
parent | 5a48afdd4d44b5865831df470a2c5d00e9cc9599 (diff) |
Merge branch 'development'1.4.4
Diffstat (limited to 'src/main/java/eu/siacs/conversations/utils/SerialSingleThreadExecutor.java')
-rw-r--r-- | src/main/java/eu/siacs/conversations/utils/SerialSingleThreadExecutor.java | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/src/main/java/eu/siacs/conversations/utils/SerialSingleThreadExecutor.java b/src/main/java/eu/siacs/conversations/utils/SerialSingleThreadExecutor.java new file mode 100644 index 00000000..bfb4668d --- /dev/null +++ b/src/main/java/eu/siacs/conversations/utils/SerialSingleThreadExecutor.java @@ -0,0 +1,34 @@ +package eu.siacs.conversations.utils; + +import java.util.ArrayDeque; +import java.util.Queue; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; + +public class SerialSingleThreadExecutor implements Executor { + + final Executor executor = Executors.newSingleThreadExecutor(); + final Queue<Runnable> tasks = new ArrayDeque(); + Runnable active; + + public synchronized void execute(final Runnable r) { + tasks.offer(new Runnable() { + public void run() { + try { + r.run(); + } finally { + scheduleNext(); + } + } + }); + if (active == null) { + scheduleNext(); + } + } + + protected synchronized void scheduleNext() { + if ((active = tasks.poll()) != null) { + executor.execute(active); + } + } +}
\ No newline at end of file |