Class AbstractPriorityScheduler
- java.lang.Object
-
- org.threadly.concurrent.AbstractSubmitterExecutor
-
- org.threadly.concurrent.AbstractSubmitterScheduler
-
- org.threadly.concurrent.AbstractPriorityScheduler
-
- All Implemented Interfaces:
java.util.concurrent.Executor,PrioritySchedulerService,SchedulerService,SubmitterExecutor,SubmitterScheduler
- Direct Known Subclasses:
NoThreadScheduler,PriorityScheduler,SingleThreadScheduler,SingleThreadSchedulerSubPool
public abstract class AbstractPriorityScheduler extends AbstractSubmitterScheduler implements PrioritySchedulerService
Abstract implementation for implementations ofPrioritySchedulerService. In general this wont be useful outside of Threadly developers, but must be a public interface since it is used in sub-packages.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:
- 4.3.0
-
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description voidexecute(java.lang.Runnable task, TaskPriority priority)Executes the task as soon as possible for the given priority.TaskPrioritygetDefaultPriority()Get the default priority for the scheduler.longgetMaxWaitForLowPriority()Getter for the amount of time a low priority task will wait during thread contention before it is eligible for execution.intgetQueuedTaskCount()Returns how many tasks are either waiting to be executed, or are scheduled to be executed at a future point.intgetQueuedTaskCount(TaskPriority priority)Returns a count of how many tasks are either waiting to be executed, or are scheduled to be executed at a future point for a specific priority.intgetWaitingForExecutionTaskCount()Returns how many tasks are either waiting to be executed.intgetWaitingForExecutionTaskCount(TaskPriority priority)Returns a count of how many tasks are either waiting to be executed for a specific priority.booleanremove(java.lang.Runnable task)Removes the runnable task from the execution queue.booleanremove(java.util.concurrent.Callable<?> task)Removes the callable task from the execution queue.voidschedule(java.lang.Runnable task, long delayInMs, TaskPriority priority)Schedule a task with a given delay and a specified priority.voidscheduleAtFixedRate(java.lang.Runnable task, long initialDelay, long period)Schedule a fixed rate recurring task to run.voidscheduleWithFixedDelay(java.lang.Runnable task, long initialDelay, long recurringDelay)Schedule a fixed delay recurring task to run.voidsetMaxWaitForLowPriority(long maxWaitForLowPriorityInMs)Changes the max wait time for low priority tasks.<T> ListenableFuture<T>submit(java.lang.Runnable task, T result, TaskPriority priority)Submit a task to run as soon as possible for the given priority.<T> ListenableFuture<T>submit(java.util.concurrent.Callable<T> task, TaskPriority priority)Submit aCallableto run as soon as possible for the given priority.<T> ListenableFuture<T>submitScheduled(java.lang.Runnable task, T result, long delayInMs, TaskPriority priority)Schedule a task with a given delay and a specified priority.<T> ListenableFuture<T>submitScheduled(java.util.concurrent.Callable<T> task, long delayInMs, TaskPriority priority)Schedule aCallablewith a given delay.-
Methods inherited from class org.threadly.concurrent.AbstractSubmitterScheduler
schedule, submitScheduled, submitScheduled
-
Methods inherited from class org.threadly.concurrent.AbstractSubmitterExecutor
execute, submit, submit
-
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.threadly.concurrent.PrioritySchedulerService
scheduleAtFixedRate, scheduleWithFixedDelay, submit, submitScheduled
-
Methods inherited from interface org.threadly.concurrent.SchedulerService
getActiveTaskCount, isShutdown
-
Methods inherited from interface org.threadly.concurrent.SubmitterExecutor
submit, submit, submit
-
Methods inherited from interface org.threadly.concurrent.SubmitterScheduler
schedule, submitScheduled, submitScheduled, submitScheduled
-
-
-
-
Method Detail
-
setMaxWaitForLowPriority
public void setMaxWaitForLowPriority(long maxWaitForLowPriorityInMs)
Changes the max wait time for low priority tasks. This is the amount of time that a low priority task will wait if there are ready to execute high priority tasks. After a low priority task has waited this amount of time, it will be executed fairly with high priority tasks (meaning it will only execute the high priority task if it has been waiting longer than the low priority task).- Parameters:
maxWaitForLowPriorityInMs- new wait time in milliseconds for low priority tasks during thread contention
-
getMaxWaitForLowPriority
public long getMaxWaitForLowPriority()
Description copied from interface:PrioritySchedulerServiceGetter for the amount of time a low priority task will wait during thread contention before it is eligible for execution.- Specified by:
getMaxWaitForLowPriorityin interfacePrioritySchedulerService- Returns:
- currently set max wait for low priority task
-
getDefaultPriority
public TaskPriority getDefaultPriority()
Description copied from interface:PrioritySchedulerServiceGet the default priority for the scheduler.- Specified by:
getDefaultPriorityin interfacePrioritySchedulerService- Returns:
- the set default task priority
-
execute
public void execute(java.lang.Runnable task, TaskPriority priority)Description copied from interface:PrioritySchedulerServiceExecutes the task as soon as possible for the given priority.- Specified by:
executein interfacePrioritySchedulerService- Parameters:
task- runnable to executepriority- priority for task to get available thread to run on
-
submit
public <T> ListenableFuture<T> submit(java.lang.Runnable task, T result, TaskPriority priority)
Description copied from interface:PrioritySchedulerServiceSubmit a task to run as soon as possible for the given priority. There is a slight increase in load when using submit over execute. So this should only be used when the future is necessary.The
Future.get()method will return the provided result once the runnable has completed.- Specified by:
submitin interfacePrioritySchedulerService- Type Parameters:
T- type of result returned from the future- Parameters:
task- runnable to be executedresult- result to be returned from resulting future .get() when runnable completespriority- priority for task to get available thread to run on- Returns:
- a future to know when the task has completed
-
submit
public <T> ListenableFuture<T> submit(java.util.concurrent.Callable<T> task, TaskPriority priority)
Description copied from interface:PrioritySchedulerServiceSubmit aCallableto run as soon as possible for the given priority. This is needed when a result needs to be consumed from the callable.- Specified by:
submitin interfacePrioritySchedulerService- Type Parameters:
T- type of result returned from the future- Parameters:
task- callable to be executedpriority- priority for task to get available thread to run on- Returns:
- a future to know when the task has completed and get the result of the callable
-
schedule
public void schedule(java.lang.Runnable task, long delayInMs, TaskPriority priority)Description copied from interface:PrioritySchedulerServiceSchedule a task with a given delay and a specified priority.- Specified by:
schedulein interfacePrioritySchedulerService- Parameters:
task- runnable to executedelayInMs- time in milliseconds to wait to execute taskpriority- priority for task to get available thread to run on
-
submitScheduled
public <T> ListenableFuture<T> submitScheduled(java.lang.Runnable task, T result, long delayInMs, TaskPriority priority)
Description copied from interface:PrioritySchedulerServiceSchedule a task with a given delay and a specified priority.The
Future.get()method will return the provided result once the runnable has completed.- Specified by:
submitScheduledin interfacePrioritySchedulerService- Type Parameters:
T- type of result returned from the future- Parameters:
task- runnable to executeresult- result to be returned from resulting future .get() when runnable completesdelayInMs- time in milliseconds to wait to execute taskpriority- priority for task to get available thread to run on- Returns:
- a future to know when the task has completed
-
submitScheduled
public <T> ListenableFuture<T> submitScheduled(java.util.concurrent.Callable<T> task, long delayInMs, TaskPriority priority)
Description copied from interface:PrioritySchedulerServiceSchedule aCallablewith a given delay. This is needed when a result needs to be consumed from the callable.- Specified by:
submitScheduledin interfacePrioritySchedulerService- Type Parameters:
T- type of result returned from the future- Parameters:
task- callable to be executeddelayInMs- time in milliseconds to wait to execute taskpriority- priority for task to get available thread to run on- Returns:
- a future to know when the task has completed and get the result of the callable
-
scheduleWithFixedDelay
public void scheduleWithFixedDelay(java.lang.Runnable task, long initialDelay, long recurringDelay)Description copied from interface:SubmitterSchedulerSchedule a fixed delay recurring task to run. The recurring delay time will be from the point where execution has finished. So the execution frequency is therecurringDelay + runtimefor the provided task.Unlike
ScheduledExecutorServiceif the task throws an exception, subsequent executions are NOT suppressed or prevented. So if the task throws an exception on every run, the task will continue to be executed at the provided recurring delay (possibly throwing an exception on each execution).- Specified by:
scheduleWithFixedDelayin interfaceSubmitterScheduler- Parameters:
task- runnable to be executedinitialDelay- delay in milliseconds until first runrecurringDelay- delay in milliseconds for running task after last finish
-
scheduleAtFixedRate
public void scheduleAtFixedRate(java.lang.Runnable task, long initialDelay, long period)Description copied from interface:SubmitterSchedulerSchedule a fixed rate recurring task to run. The recurring delay will be the same, regardless of how long task execution takes. A given runnable will not run concurrently (unless it is submitted to the scheduler multiple times). Instead of execution takes longer than the period, the next run will occur immediately (given thread availability in the pool).Unlike
ScheduledExecutorServiceif the task throws an exception, subsequent executions are NOT suppressed or prevented. So if the task throws an exception on every run, the task will continue to be executed at the provided recurring delay (possibly throwing an exception on each execution).- Specified by:
scheduleAtFixedRatein interfaceSubmitterScheduler- Parameters:
task- runnable to be executedinitialDelay- delay in milliseconds until first runperiod- amount of time in milliseconds between the start of recurring executions
-
remove
public boolean remove(java.lang.Runnable task)
Description copied from interface:SchedulerServiceRemoves the runnable task from the execution queue. It is possible for the runnable to still run until this call has returned.Note that this call has high guarantees on the ability to remove the task (as in a complete guarantee). But while this is being invoked, it will reduce the throughput of execution, so should NOT be used extremely frequently.
For non-recurring tasks using a future and calling
Future.cancel(boolean)can be a better solution.- Specified by:
removein interfaceSchedulerService- Parameters:
task- The original runnable provided to the executor- Returns:
trueif the runnable was found and removed
-
remove
public boolean remove(java.util.concurrent.Callable<?> task)
Description copied from interface:SchedulerServiceRemoves the callable task from the execution queue. It is possible for the callable to still run until this call has returned.Note that this call has high guarantees on the ability to remove the task (as in a complete guarantee). But while this is being invoked, it will reduce the throughput of execution, so should NOT be used extremely frequently.
For non-recurring tasks using a future and calling
Future.cancel(boolean)can be a better solution.- Specified by:
removein interfaceSchedulerService- Parameters:
task- The original callable provided to the executor- Returns:
trueif the callable was found and removed
-
getQueuedTaskCount
public int getQueuedTaskCount()
Description copied from interface:SchedulerServiceReturns how many tasks are either waiting to be executed, or are scheduled to be executed at a future point. This can indicate pool back pressure, but it can also just indicate generally scheduled tasks. It's computationally cheaper thanSchedulerService.getWaitingForExecutionTaskCount().- Specified by:
getQueuedTaskCountin interfaceSchedulerService- Returns:
- quantity of tasks waiting execution or scheduled to be executed later
-
getQueuedTaskCount
public int getQueuedTaskCount(TaskPriority priority)
Description copied from interface:PrioritySchedulerServiceReturns a count of how many tasks are either waiting to be executed, or are scheduled to be executed at a future point for a specific priority. This can indicate pool back pressure, but it can also just indicate generally scheduled tasks. It's computationally cheaper thanPrioritySchedulerService.getWaitingForExecutionTaskCount(TaskPriority).- Specified by:
getQueuedTaskCountin interfacePrioritySchedulerService- Parameters:
priority- priority for tasks to be counted- Returns:
- quantity of tasks waiting execution or scheduled to be executed later
-
getWaitingForExecutionTaskCount
public int getWaitingForExecutionTaskCount()
Description copied from interface:SchedulerServiceReturns how many tasks are either waiting to be executed. A value here can indicate the pool is being starved for threads.- Specified by:
getWaitingForExecutionTaskCountin interfaceSchedulerService- Returns:
- quantity of tasks waiting execution
-
getWaitingForExecutionTaskCount
public int getWaitingForExecutionTaskCount(TaskPriority priority)
Description copied from interface:PrioritySchedulerServiceReturns a count of how many tasks are either waiting to be executed for a specific priority. A value here can indicate the pool is being starved for threads.- Specified by:
getWaitingForExecutionTaskCountin interfacePrioritySchedulerService- Parameters:
priority- priority for tasks to be counted- Returns:
- quantity of tasks waiting execution
-
-