Class RunnableQueue

  • All Implemented Interfaces:
    java.lang.Runnable

    public class RunnableQueue
    extends java.lang.Object
    implements java.lang.Runnable
    This 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 $
    • Field Detail

      • 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.
      • 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.
      • runnableQueueThread

        protected volatile HaltingThread runnableQueueThread
        The current thread.
      • idleRunnableWaitTime

        private long idleRunnableWaitTime
        The time (in milliseconds) that the idle runnable should be run next.
      • threadCount

        private static volatile int threadCount
    • Constructor Detail

      • RunnableQueue

        public RunnableQueue()
    • 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:
        run in interface java.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.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:
        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.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:
        java.lang.IllegalStateException - if getThread() is null or if the thread returned by getThread() is the current one.
        java.lang.InterruptedException
      • 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.
      • 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.