Class RunnableQueue

java.lang.Object
org.apache.batik.util.RunnableQueue
All Implemented Interfaces:
Runnable

public class RunnableQueue extends Object implements Runnable
This class represents an object which queues Runnable objects for invocation in a single thread.
  • Field Details

    • 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 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.
    • 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.
  • Constructor Details

    • RunnableQueue

      public RunnableQueue()
  • Method Details

    • 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:
      run in interface 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(Runnable r)
      Schedules the given Runnable object for a later invocation, and returns. An exception is thrown if the RunnableQueue was not started.
      Throws:
      IllegalStateException - if getThread() is null.
    • invokeAndWait

      public void invokeAndWait(Runnable r) throws InterruptedException
      Waits until the given Runnable's run() has returned. Note: invokeAndWait() must not be called from the current thread (for example from the run() method of the argument).
      Throws:
      IllegalStateException - if getThread() is null or if the thread returned by getThread() is the current one.
      InterruptedException
    • preemptLater

      public void preemptLater(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:
      IllegalStateException - if getThread() is null.
    • preemptAndWait

      public void preemptAndWait(Runnable r) throws InterruptedException
      Waits until the given Runnable's run() 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 the run() method of the argument).
      Throws:
      IllegalStateException - if getThread() is null or if the thread returned by getThread() is the current one.
      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:
      IllegalStateException - if getThread() is null.
    • resumeExecution

      public void resumeExecution()
      Resumes the execution of this queue.
      Throws:
      IllegalStateException - if getThread() is null.
    • getIteratorLock

      public Object getIteratorLock()
      Returns iterator lock to use to work with the iterator returned by iterator().
    • iterator

      public 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(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(Runnable rable)
      Called when a Runnable completes. Currently just notifies runHandler
      Parameters:
      rable - The runnable that just completed.