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;
/**
* Since the conversion to a {@link SubmitterExecutor} from an executor is often the same (just
* using the {@link ListenableFutureTask} to wrap the task). This class provides an easy way to
* create a {@link SubmitterExecutor}. Take a look at
* {@link org.threadly.concurrent.wrapper.SubmitterExecutorAdapter} for an easy example of how
* this is used. In general this wont be useful outside of Threadly developers, but must be a
* public visibility 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 1.3.0
*/
public abstract class AbstractSubmitterExecutor implements SubmitterExecutor {
/**
* Should execute the provided task, or provide the task to a given executor. All error
* checking has completed by this point.
*
* @param task Runnable ready to be ran
*/
protected abstract void doExecute(Runnable task);
@Override
public void execute(Runnable task) {
ArgumentVerifier.assertNotNull(task, "task");
doExecute(task);
}
@Override
public ListenableFuture<?> submit(Runnable task) {
return submit(task, null);
}
@Override
public <T> ListenableFuture<T> submit(Runnable task, T result) {
return submit(new RunnableCallableAdapter<>(task, result));
}
@Override
public <T> ListenableFuture<T> submit(Callable<T> task) {
ArgumentVerifier.assertNotNull(task, "task");
ListenableFutureTask<T> lft = new ListenableFutureTask<>(false, task);
doExecute(lft);
return lft;
}
}