package org.threadly.concurrent;
import java.util.concurrent.Callable;
import org.threadly.concurrent.future.ListenableFuture;
import org.threadly.concurrent.future.ListenableFutureTask;
import org.threadly.util.ArgumentVerifier;
/**
* Similar to the {@link AbstractSubmitterExecutor} this abstract class is designed to reduce code
* duplication for the multiple schedule functions. This includes error checking, as well as
* wrapping things up in {@link ListenableFutureTask}'s if necessary. In general this wont be
* useful outside of Threadly developers, but must be a public interface since it is used in
* sub-packages.
* <p>
* If you do find yourself using this class, please post an issue on github to tell us why. If
* there is something you want our schedulers to provide, we are happy to hear about it.
*
* @since 2.0.0
*/
public abstract class AbstractSubmitterScheduler extends AbstractSubmitterExecutor
implements SubmitterScheduler {
@Override
protected void doExecute(Runnable task) {
doSchedule(task, 0);
}
/**
* Should schedule the provided task. All error checking has completed by this point.
*
* @param task Runnable ready to be ran
* @param delayInMillis delay to schedule task out to
*/
protected abstract void doSchedule(Runnable task, long delayInMillis);
@Override
public void schedule(Runnable task, long delayInMs) {
ArgumentVerifier.assertNotNull(task, "task");
ArgumentVerifier.assertNotNegative(delayInMs, "delayInMs");
doSchedule(task, delayInMs);
}
@Override
public ListenableFuture<?> submitScheduled(Runnable task, long delayInMs) {
return submitScheduled(task, null, delayInMs);
}
@Override
public <T> ListenableFuture<T> submitScheduled(Runnable task, T result, long delayInMs) {
return submitScheduled(new RunnableCallableAdapter<>(task, result), delayInMs);
}
@Override
public <T> ListenableFuture<T> submitScheduled(Callable<T> task, long delayInMs) {
ArgumentVerifier.assertNotNull(task, "task");
ArgumentVerifier.assertNotNegative(delayInMs, "delayInMs");
ListenableFutureTask<T> lft = new ListenableFutureTask<>(false, task);
doSchedule(lft, delayInMs);
return lft;
}
}