package tc.oc.commons.core.concurrent; import java.util.ArrayDeque; import java.util.Deque; import java.util.concurrent.Executor; /** * Non-concurrent Executor that ensures tasks run in the order they are submitted, * and not more than one at a time. If a task submits another task, the latter * will not actually run until the former returns. * * This is NOT thread-safe, all tasks must be submitted from the same thread. */ public class SerializingExecutor implements Executor { private final Deque<Runnable> queue = new ArrayDeque<>(); private boolean processing; @Override public void execute(Runnable command) { queue.addLast(command); process(); } private void process() { if(!processing) { processing = true; try { Runnable runnable; while((runnable = queue.pollFirst()) != null) { runnable.run(); } } finally { processing = false; } } } }