package org.threadly.concurrent.wrapper;
import java.util.concurrent.Callable;
import org.threadly.concurrent.PrioritySchedulerService;
import org.threadly.concurrent.TaskPriority;
import org.threadly.concurrent.future.ListenableFuture;
import org.threadly.util.ArgumentVerifier;
/**
* Class to wrap any implementation of {@link PrioritySchedulerService}. The purpose of wrapping
* like this would be to change the default priority from the wrapped instance. That way this
* could be passed into other parts of code and although use the same thread pool, have different
* default priorities. (this could be particularly useful when used in combination with
* {@link KeyDistributedExecutor}, or {@link KeyDistributedScheduler}.
*
* @since 4.6.0 (since 1.0.0 as org.threadly.concurrent.PrioritySchedulerWrapper)
*/
public class PrioritySchedulerDefaultPriorityWrapper implements PrioritySchedulerService {
protected final PrioritySchedulerService scheduler;
protected final TaskPriority defaultPriority;
/**
* Constructs a new priority wrapper with a new default priority to use.
*
* @param scheduler PriorityScheduler implementation to default to
* @param defaultPriority default priority for tasks submitted without a priority
*/
public PrioritySchedulerDefaultPriorityWrapper(PrioritySchedulerService scheduler,
TaskPriority defaultPriority) {
ArgumentVerifier.assertNotNull(scheduler, "scheduler");
ArgumentVerifier.assertNotNull(defaultPriority, "defaultPriority");
this.scheduler = scheduler;
this.defaultPriority = defaultPriority;
}
@Override
public void execute(Runnable command) {
scheduler.execute(command, defaultPriority);
}
@Override
public void execute(Runnable task, TaskPriority priority) {
scheduler.execute(task, priority);
}
@Override
public ListenableFuture<?> submit(Runnable task) {
return scheduler.submit(task, defaultPriority);
}
@Override
public <T> ListenableFuture<T> submit(Runnable task, T result) {
return scheduler.submit(task, result, defaultPriority);
}
@Override
public ListenableFuture<?> submit(Runnable task, TaskPriority priority) {
return scheduler.submit(task, priority);
}
@Override
public <T> ListenableFuture<T> submit(Runnable task, T result, TaskPriority priority) {
return scheduler.submit(task, result, priority);
}
@Override
public <T> ListenableFuture<T> submit(Callable<T> task) {
return scheduler.submit(task, defaultPriority);
}
@Override
public <T> ListenableFuture<T> submit(Callable<T> task, TaskPriority priority) {
return scheduler.submit(task, priority);
}
@Override
public void schedule(Runnable task, long delayInMs) {
scheduler.schedule(task, delayInMs, defaultPriority);
}
@Override
public void schedule(Runnable task, long delayInMs, TaskPriority priority) {
scheduler.schedule(task, delayInMs, priority);
}
@Override
public ListenableFuture<?> submitScheduled(Runnable task, long delayInMs) {
return scheduler.submitScheduled(task, delayInMs, defaultPriority);
}
@Override
public <T> ListenableFuture<T> submitScheduled(Runnable task, T result, long delayInMs) {
return scheduler.submitScheduled(task, result, delayInMs, defaultPriority);
}
@Override
public ListenableFuture<?> submitScheduled(Runnable task, long delayInMs,
TaskPriority priority) {
return scheduler.submitScheduled(task, delayInMs, priority);
}
@Override
public <T> ListenableFuture<T> submitScheduled(Runnable task, T result, long delayInMs,
TaskPriority priority) {
return scheduler.submitScheduled(task, result, delayInMs, priority);
}
@Override
public <T> ListenableFuture<T> submitScheduled(Callable<T> task, long delayInMs) {
return scheduler.submitScheduled(task, delayInMs, defaultPriority);
}
@Override
public <T> ListenableFuture<T> submitScheduled(Callable<T> task, long delayInMs,
TaskPriority priority) {
return scheduler.submitScheduled(task, delayInMs, priority);
}
@Override
public void scheduleWithFixedDelay(Runnable task, long initialDelay, long recurringDelay) {
scheduler.scheduleWithFixedDelay(task, initialDelay, recurringDelay, defaultPriority);
}
@Override
public void scheduleWithFixedDelay(Runnable task, long initialDelay, long recurringDelay,
TaskPriority priority) {
scheduler.scheduleWithFixedDelay(task, initialDelay, recurringDelay, priority);
}
@Override
public void scheduleAtFixedRate(Runnable task, long initialDelay, long period) {
scheduler.scheduleAtFixedRate(task, initialDelay, period, defaultPriority);
}
@Override
public void scheduleAtFixedRate(Runnable task, long initialDelay, long period,
TaskPriority priority) {
scheduler.scheduleAtFixedRate(task, initialDelay, period, priority);
}
@Override
public boolean remove(Runnable task) {
return scheduler.remove(task);
}
@Override
public boolean remove(Callable<?> task) {
return scheduler.remove(task);
}
@Override
public boolean isShutdown() {
return scheduler.isShutdown();
}
@Override
public TaskPriority getDefaultPriority() {
return defaultPriority;
}
@Override
public long getMaxWaitForLowPriority() {
return scheduler.getMaxWaitForLowPriority();
}
@Override
public int getActiveTaskCount() {
return scheduler.getActiveTaskCount();
}
@Override
public int getQueuedTaskCount() {
return scheduler.getQueuedTaskCount();
}
@Override
public int getQueuedTaskCount(TaskPriority priority) {
return scheduler.getQueuedTaskCount(priority);
}
}