User: ejort   
  Date: 02/01/18 12:32:43

  Added:       src/main/org/jboss/mx/util ThreadPool.java
  Log:
  Thread Pooling of Services
  
  Revision  Changes    Path
  1.1                  jmx/src/main/org/jboss/mx/util/ThreadPool.java
  
  Index: ThreadPool.java
  ===================================================================
  /*
   * JBoss, the OpenSource J2EE webOS
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  
  package org.jboss.mx.util;
  
  import java.util.Stack;
  
  /**
   * A simple thread pool. Idle threads are cached for future use.
   * The cache grows until it reaches a maximum size (default 10).
   * When there is nothing in the cache, a new thread is created.
   * By default the threads are daemon threads.
   *
   * <a href="mailto:[EMAIL PROTECTED]";>Rickard \u00d6berg</a>
   * <a href="mailto:[EMAIL PROTECTED]";>Adrian Brock</a>
   * @version $Revision: 1.1 $
   */
  public class ThreadPool
  {
    // Constants -----------------------------------------------------
  
    // Attributes ----------------------------------------------------
  
    /**
     * Stack of idle threads cached for future use.
     */
    private Stack pool = new Stack();
  
    /**
     * Maximum number of idle threads cached in this pool.
     */
    private int maxSize = 10;
  
    /**
     * Is the thread pool active
     */
    private boolean active = false;
  
    /**
     * Whether the threads are daemon threads.
     */
    private boolean daemon = true;
  
    // Static --------------------------------------------------------
  
    // Constructors --------------------------------------------------
  
    /**
     * Create a new pool.
     */
    public ThreadPool()
    {
    }
  
    // Public --------------------------------------------------------
  
    /**
     * Set the maximum number of idle threads cached in this pool.
     *
     * @param size the new maximum size.
     */
    public void setMaximumSize(int size)
    {
      maxSize = size;
    }
  
    /**
     * Get the maximum number of idle threads cached in this pool.
     *
     * @returns the maximum size
     */
    public int getMaximumSize()
    {
      return maxSize;
    }
  
    /**
     * Set the activity status of the pool. Setting the pool to
     * inactive, clears the pool.
     *
     * @param status pass true for active, false otherwise.
     */
    public void setActive(boolean status)
    {
      active = status;
      if (active == false)
        while (pool.size() > 0)
          ((Worker)pool.pop()).die();
    }
  
    /**
     * Get the activity status of the pool.
     *
     * @returns true for an active pool, false otherwise.
     */
    public boolean isActive()
    {
      return active;
    }
  
    /**
     * Set whether new threads are daemon threads.
     *
     * @param value pass true for daemon threads, false otherwise.
     */
    public void setDaemonThreads(boolean value)
    {
      daemon = value;
    }
  
    /**
     * Get whether new threads are daemon threads.
     *
     * @returns true for daemon threads, false otherwise.
     */
    public boolean getDaemonThreads()
    {
      return daemon;
    }
  
    /**
     * Do some work.
     * This will either create a new thread to do the work, or
     * use an existing idle cached thread.
     *
     * @param work the work to perform.
     */
     public synchronized void run(Runnable work)
     {
       if (pool.size() == 0)
         new Worker(work);
       else 
       {
         Worker worker = (Worker) pool.pop();
         worker.run(work);
       }
     }
  
     // Private -------------------------------------------------------
  
     /**
      * Put an idle worker thread back in the pool of cached idle threads.
      * This is called from the worker thread itself. When the cache is
      * full, the thread is discarded.
      *
      * @param worker the worker to return.
      */
     private synchronized void returnWorker(Worker worker)
     {
       if (pool.size() < maxSize)
         pool.push(worker);
       else
         worker.die();   
     }
  
     // Inner classes -------------------------------------------------
  
    /**
     * A worker thread runs a worker.
     */
    class Worker extends Thread
    {
      /**
       * Flags that this worker may continue to work.
       */
      boolean running = true;
  
      /**
       * Work to do, of <code>null</code> if no work to do.
       */
      Runnable work;
  
      /**
      * Create a new Worker to do some work.
      *
      * @param work the work to perform
      */
      Worker(Runnable work)
      {
        this.work = work;
        setDaemon(daemon);
        start();
      }
  
      /**
       * Tell this worker to die.
       */
      public synchronized void die()
      {
        running = false;
        this.notify();
      }
  
      /**
       * Give this Worker some work to do.
       *
       * @param the work to perform.
       * @throws IllegalStateException If this worker already
       *         has work to do.
       */
      public synchronized void run(Runnable work)
      {
        if (this.work != null)
          throw new IllegalStateException("Worker already has work to do.");
        this.work = work;
        this.notify();
      }
  
      /**
       * The worker loop.
       */
      public void run()
      {
        while (active && running)
        {
          // If work is available then execute it
          if (work != null)
          {
            try
            {
              work.run();
            }
            catch (Exception ignored) {}
  
            // Clear work
            work = null;
          }
                  
          // Return to pool of cached idle threads
          returnWorker(this);
  
          // Wait for more work to become available
          synchronized (this)
          {
            while (running && work == null)
            {
              try
              {
                this.wait();
              }
              catch (InterruptedException ignored) {}
            }
          }
        }
      }
    }
  }
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to