Package org.apache.batik.util
Class RunnableQueue
- java.lang.Object
-
- org.apache.batik.util.RunnableQueue
-
- All Implemented Interfaces:
java.lang.Runnable
public class RunnableQueue extends java.lang.Object implements java.lang.RunnableThis class represents an object which queues Runnable objects for invocation in a single thread.- Version:
- $Id: RunnableQueue.java 1733416 2016-03-03 07:07:13Z gadams $
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceRunnableQueue.IdleRunnableARunnablethat can also inform the caller how long it should be until it is run again.protected static classRunnableQueue.LinkTo store a Runnable.protected static classRunnableQueue.LockableLinkTo store a Runnable with an object waiting for him to be executed.static interfaceRunnableQueue.RunHandlerThis interface must be implemented by an object which wants to be notified of run events.static classRunnableQueue.RunHandlerAdapterThis is an adapter class that implements the RunHandler interface.static classRunnableQueue.RunnableQueueStateType-safe enumeration of queue states.
-
Field Summary
Fields Modifier and Type Field Description private RunnableQueue.IdleRunnableidleRunnableTheRunnableQueue.IdleRunnableto run if the queue is empty.private longidleRunnableWaitTimeThe time (in milliseconds) that the idle runnable should be run next.private DoublyLinkedListlistThe Runnable objects list, also used as synchronization point for pushing/poping runables.protected intpreemptCountCount of preempt entries in queue, so preempt entries can be kept properly ordered.protected RunnableQueue.RunHandlerrunHandlerThe object which handle run events.protected HaltingThreadrunnableQueueThreadThe current thread.static RunnableQueue.RunnableQueueStateRUNNINGThe queue is in the process of running tasks.protected RunnableQueue.RunnableQueueStatestateThe Suspension state of this thread.protected java.lang.ObjectstateLockObject to synchronize/wait/notify for suspension issues.static RunnableQueue.RunnableQueueStateSUSPENDEDThe queue is no longer running any tasks and will not run any tasks until resumeExecution is called.static RunnableQueue.RunnableQueueStateSUSPENDINGThe queue may still be running tasks but as soon as possible will go to SUSPENDED state.private static intthreadCountprotected booleanwasResumedUsed to indicate if the queue was resumed while still running, so a 'resumed' event can be sent.
-
Constructor Summary
Constructors Constructor Description RunnableQueue()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description static RunnableQueuecreateRunnableQueue()Creates a new RunnableQueue started in a new thread.protected voidexecutionResumed()Called when execution is being resumed.protected voidexecutionSuspended()Called when execution is being suspended.java.lang.ObjectgetIteratorLock()Returns iterator lock to use to work with the iterator returned by iterator().RunnableQueue.RunnableQueueStategetQueueState()RunnableQueue.RunHandlergetRunHandler()Returns the RunHandler or null.HaltingThreadgetThread()Returns the thread in which the RunnableQueue is currently running.voidinvokeAndWait(java.lang.Runnable r)Waits until the given Runnable'srun()has returned.voidinvokeLater(java.lang.Runnable r)Schedules the given Runnable object for a later invocation, and returns.java.util.Iteratoriterator()Returns an iterator over the runnables.voidpreemptAndWait(java.lang.Runnable r)Waits until the given Runnable'srun()has returned.voidpreemptLater(java.lang.Runnable r)Schedules the given Runnable object for a later invocation, and returns.voidresumeExecution()Resumes the execution of this queue.voidrun()Runs this queue.protected voidrunnableInvoked(java.lang.Runnable rable)Called when a Runnable completes.protected voidrunnableStart(java.lang.Runnable rable)Called just prior to executing a Runnable.voidsetIdleRunnable(RunnableQueue.IdleRunnable r)Sets a Runnable to be run whenever the queue is empty.voidsetRunHandler(RunnableQueue.RunHandler rh)Sets the RunHandler for this queue.voidsuspendExecution(boolean waitTillSuspended)Suspends the execution of this queue after the current runnable completes.
-
-
-
Field Detail
-
RUNNING
public static final RunnableQueue.RunnableQueueState RUNNING
The queue is in the process of running tasks.
-
SUSPENDING
public static final RunnableQueue.RunnableQueueState SUSPENDING
The queue may still be running tasks but as soon as possible will go to SUSPENDED state.
-
SUSPENDED
public static final RunnableQueue.RunnableQueueState SUSPENDED
The queue is no longer running any tasks and will not run any tasks until resumeExecution is called.
-
state
protected volatile RunnableQueue.RunnableQueueState state
The Suspension state of this thread.
-
stateLock
protected final java.lang.Object stateLock
Object to synchronize/wait/notify for suspension issues.
-
wasResumed
protected boolean wasResumed
Used to indicate if the queue was resumed while still running, so a 'resumed' event can be sent.
-
list
private final DoublyLinkedList list
The Runnable objects list, also used as synchronization point for pushing/poping runables.
-
preemptCount
protected int preemptCount
Count of preempt entries in queue, so preempt entries can be kept properly ordered.
-
runHandler
protected RunnableQueue.RunHandler runHandler
The object which handle run events.
-
runnableQueueThread
protected volatile HaltingThread runnableQueueThread
The current thread.
-
idleRunnable
private RunnableQueue.IdleRunnable idleRunnable
TheRunnableQueue.IdleRunnableto run if the queue is empty.
-
idleRunnableWaitTime
private long idleRunnableWaitTime
The time (in milliseconds) that the idle runnable should be run next.
-
threadCount
private static volatile int threadCount
-
-
Method Detail
-
createRunnableQueue
public static RunnableQueue createRunnableQueue()
Creates a new RunnableQueue started in a new thread.- Returns:
- a RunnableQueue which is guaranteed to have entered its
run()method.
-
run
public void run()
Runs this queue.- Specified by:
runin interfacejava.lang.Runnable
-
getThread
public HaltingThread getThread()
Returns the thread in which the RunnableQueue is currently running.- Returns:
- null if the RunnableQueue has not entered his
run()method.
-
invokeLater
public void invokeLater(java.lang.Runnable r)
Schedules the given Runnable object for a later invocation, and returns. An exception is thrown if the RunnableQueue was not started.- Throws:
java.lang.IllegalStateException- if getThread() is null.
-
invokeAndWait
public void invokeAndWait(java.lang.Runnable r) throws java.lang.InterruptedExceptionWaits until the given Runnable'srun()has returned. Note:invokeAndWait()must not be called from the current thread (for example from therun()method of the argument).- Throws:
java.lang.IllegalStateException- if getThread() is null or if the thread returned by getThread() is the current one.java.lang.InterruptedException
-
preemptLater
public void preemptLater(java.lang.Runnable r)
Schedules the given Runnable object for a later invocation, and returns. The given runnable preempts any runnable that is not currently executing (ie the next runnable started will be the one given). An exception is thrown if the RunnableQueue was not started.- Throws:
java.lang.IllegalStateException- if getThread() is null.
-
preemptAndWait
public void preemptAndWait(java.lang.Runnable r) throws java.lang.InterruptedExceptionWaits until the given Runnable'srun()has returned. The given runnable preempts any runnable that is not currently executing (ie the next runnable started will be the one given). Note:preemptAndWait()must not be called from the current thread (for example from therun()method of the argument).- Throws:
java.lang.IllegalStateException- if getThread() is null or if the thread returned by getThread() is the current one.java.lang.InterruptedException
-
getQueueState
public RunnableQueue.RunnableQueueState getQueueState()
-
suspendExecution
public void suspendExecution(boolean waitTillSuspended)
Suspends the execution of this queue after the current runnable completes.- Parameters:
waitTillSuspended- if true this method will not return until the queue has suspended (no runnable in progress or about to be in progress). If resumeExecution is called while waiting will simply return (this really indicates a race condition in your code). This may return before an associated RunHandler is notified.- Throws:
java.lang.IllegalStateException- if getThread() is null.
-
resumeExecution
public void resumeExecution()
Resumes the execution of this queue.- Throws:
java.lang.IllegalStateException- if getThread() is null.
-
getIteratorLock
public java.lang.Object getIteratorLock()
Returns iterator lock to use to work with the iterator returned by iterator().
-
iterator
public java.util.Iterator iterator()
Returns an iterator over the runnables.
-
setRunHandler
public void setRunHandler(RunnableQueue.RunHandler rh)
Sets the RunHandler for this queue.
-
getRunHandler
public RunnableQueue.RunHandler getRunHandler()
Returns the RunHandler or null.
-
setIdleRunnable
public void setIdleRunnable(RunnableQueue.IdleRunnable r)
Sets a Runnable to be run whenever the queue is empty.
-
executionSuspended
protected void executionSuspended()
Called when execution is being suspended. Currently just notifies runHandler
-
executionResumed
protected void executionResumed()
Called when execution is being resumed. Currently just notifies runHandler
-
runnableStart
protected void runnableStart(java.lang.Runnable rable)
Called just prior to executing a Runnable. Currently just notifies runHandler- Parameters:
rable- The runnable that is about to start
-
runnableInvoked
protected void runnableInvoked(java.lang.Runnable rable)
Called when a Runnable completes. Currently just notifies runHandler- Parameters:
rable- The runnable that just completed.
-
-