package org.threadly.concurrent.wrapper; import org.threadly.concurrent.AbstractSubmitterScheduler; import org.threadly.concurrent.SubmitterExecutor; import org.threadly.concurrent.SubmitterScheduler; import org.threadly.util.ArgumentVerifier; /** * Class which takes in both an executor and a scheduler. Delegating executions to the executor * when possible, and otherwise submitting to the provided scheduler. This can be used to provide * different behavior/implementations between scheduled and executed tasks (for example you could * use {@link PrioritySchedulerDefaultPriorityWrapper} to have a different default priority for * scheduled tasks vs executed). * * @since 4.7.0 */ public class SchedulerExecutorDelegator extends AbstractSubmitterScheduler { protected final SubmitterExecutor parentExecutor; protected final SubmitterScheduler parentScheduler; /** * Constructs a new delegator with the provided pools to defer executions to. * * @param parentExecutor Executor to use when ever possible * @param parentScheduler Scheduler to use when executions need to be delayed */ public SchedulerExecutorDelegator(SubmitterExecutor parentExecutor, SubmitterScheduler parentScheduler) { ArgumentVerifier.assertNotNull(parentExecutor, "parentExecutor"); ArgumentVerifier.assertNotNull(parentScheduler, "parentScheduler"); this.parentExecutor = parentExecutor; this.parentScheduler = parentScheduler; } @Override public void scheduleWithFixedDelay(Runnable task, long initialDelay, long recurringDelay) { parentScheduler.scheduleWithFixedDelay(task, initialDelay, recurringDelay); } @Override public void scheduleAtFixedRate(Runnable task, long initialDelay, long period) { parentScheduler.scheduleAtFixedRate(task, initialDelay, period); } @Override protected void doSchedule(Runnable task, long delayInMillis) { if (delayInMillis > 0) { parentScheduler.schedule(task, delayInMillis); } else { parentExecutor.execute(task); } } }