package org.infinispan.atomic.container; import java.util.ArrayDeque; import java.util.Queue; import java.util.concurrent.Executor; /** * * This executor below serializes the submission of tasks to a second executor, illustrating a composite executor. * From the Java Executor class documentation. * * @author Pierre Sutra * @since 7.2 */ public class SerialExecutor implements Executor { final Queue<Runnable> tasks = new ArrayDeque<Runnable>(); final Executor executor; Runnable active; public SerialExecutor(Executor executor) { this.executor = executor; } 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); } } }