线程池--jetty中QueuedThreadPool分析(一)

jetty版本:jetty-6.1.26

1.由于jetty中的许多组件都实现了LifeCycle接口,先了解下该接口的定义:

 

Java代码   收藏代码
  1. package org.mortbay.component;  
  2.   
  3. import java.util.EventListener;  
  4.   
  5. public interface LifeCycle  
  6. {  
  7.      public void start()  throws Exception;  
  8.      public void stop()   throws Exception;  
  9.     
  10.     public boolean isRunning();    
  11.     public boolean isStarted();     
  12.     public boolean isStarting();  
  13.     public boolean isStopping();      
  14.     public boolean isStopped();  
  15.     public boolean isFailed();  
  16.      
  17.     public void addLifeCycleListener(LifeCycle.Listener listener);  
  18.     public void removeLifeCycleListener(LifeCycle.Listener listener);  
  19.       
  20.   
  21.     /* ------------------------------------------------------------ */  
  22.     /** Listener. 
  23.      * A listener for Lifecycle events. 
  24.      */  
  25.     public interface Listener extends EventListener  
  26.     {  
  27.         public void lifeCycleStarting(LifeCycle event);  
  28.         public void lifeCycleStarted(LifeCycle event);  
  29.         public void lifeCycleFailure(LifeCycle event,Throwable cause);  
  30.         public void lifeCycleStopping(LifeCycle event);  
  31.         public void lifeCycleStopped(LifeCycle event);  
  32.     }  
  33. }  

2.AbstractLifeCycle的抽象类,该类实现了LifeCycle接口(其中start()和stop()两个方法在类中采用模板模式实现):

 

Java代码   收藏代码
  1. //========================================================================  
  2. //$Id: AbstractLifeCycle.java,v 1.3 2005/11/11 22:55:41 gregwilkins Exp $  
  3. //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd.  
  4. //------------------------------------------------------------------------  
  5. //Licensed under the Apache License, Version 2.0 (the "License");  
  6. //you may not use this file except in compliance with the License.  
  7. //You may obtain a copy of the License at  
  8. //http://www.apache.org/licenses/LICENSE-2.0  
  9. //Unless required by applicable law or agreed to in writing, software  
  10. //distributed under the License is distributed on an "AS IS" BASIS,  
  11. //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  12. //See the License for the specific language governing permissions and  
  13. //limitations under the License.  
  14. //========================================================================  
  15.   
  16. package org.mortbay.component;  
  17.   
  18. import org.mortbay.log.Log;  
  19. import org.mortbay.util.LazyList;  
  20.   
  21. /** 
  22.  * Basic implementation of the life cycle interface for components. 
  23.  *  
  24.  * @author gregw 
  25.  */  
  26. public abstract class AbstractLifeCycle implements LifeCycle  
  27. {  
  28.     private Object _lock = new Object();  
  29.     private final int FAILED = -1, STOPPED = 0, STARTING = 1, STARTED = 2, STOPPING = 3;  
  30.     private volatile int _state = STOPPED;  
  31.     protected LifeCycle.Listener[] _listeners;  
  32.   
  33.     protected void doStart() throws Exception  
  34.     {  
  35.     }  
  36.   
  37.     protected void doStop() throws Exception  
  38.     {  
  39.     }  
  40.   
  41.     public final void start() throws Exception  
  42.     {  
  43.         synchronized (_lock)  
  44.         {  
  45.             try  
  46.             {  
  47.                 if (_state == STARTED || _state == STARTING)  
  48.                     return;  
  49.                 setStarting();  
  50.                 doStart();  
  51.                 Log.debug("started {}",this);  
  52.                 setStarted();  
  53.             }  
  54.             catch (Exception e)  
  55.             {  
  56.                 setFailed(e);  
  57.                 throw e;  
  58.             }  
  59.             catch (Error e)  
  60.             {  
  61.                 setFailed(e);  
  62.                 throw e;  
  63.             }  
  64.         }  
  65.     }  
  66.   
  67.     public final void stop() throws Exception  
  68.     {  
  69.         synchronized (_lock)  
  70.         {  
  71.             try  
  72.             {  
  73.                 if (_state == STOPPING || _state == STOPPED)  
  74.                     return;  
  75.                 setStopping();  
  76.                 doStop();  
  77.                 Log.debug("stopped {}",this);  
  78.                 setStopped();  
  79.             }  
  80.             catch (Exception e)  
  81.             {  
  82.                 setFailed(e);  
  83.                 throw e;  
  84.             }  
  85.             catch (Error e)  
  86.             {  
  87.                 setFailed(e);  
  88.                 throw e;  
  89.             }  
  90.         }  
  91.     }  
  92.   
  93.     public boolean isRunning()  
  94.     {  
  95.         return _state == STARTED || _state == STARTING;  
  96.     }  
  97.   
  98.     public boolean isStarted()  
  99.     {  
  100.         return _state == STARTED;  
  101.     }  
  102.   
  103.     public boolean isStarting()  
  104.     {  
  105.         return _state == STARTING;  
  106.     }  
  107.   
  108.     public boolean isStopping()  
  109.     {  
  110.         return _state == STOPPING;  
  111.     }  
  112.   
  113.     public boolean isStopped()  
  114.     {  
  115.         return _state == STOPPED;  
  116.     }  
  117.   
  118.     public boolean isFailed()  
  119.     {  
  120.         return _state == FAILED;  
  121.     }  
  122.   
  123.     public void addLifeCycleListener(LifeCycle.Listener listener)  
  124.     {  
  125.         _listeners = (LifeCycle.Listener[])LazyList.addToArray(_listeners,listener,LifeCycle.Listener.class);  
  126.     }  
  127.   
  128.     public void removeLifeCycleListener(LifeCycle.Listener listener)  
  129.     {  
  130.         _listeners = (LifeCycle.Listener[])LazyList.removeFromArray(_listeners,listener);  
  131.     }  
  132.   
  133.     private void setStarted()  
  134.     {  
  135.         _state = STARTED;  
  136.         if (_listeners != null)  
  137.         {  
  138.             for (int i = 0; i < _listeners.length; i++)  
  139.             {  
  140.                 _listeners[i].lifeCycleStarted(this);  
  141.             }  
  142.         }  
  143.     }  
  144.   
  145.     private void setStarting()  
  146.     {  
  147.         _state = STARTING;  
  148.         if (_listeners != null)  
  149.         {  
  150.             for (int i = 0; i < _listeners.length; i++)  
  151.             {  
  152.                 _listeners[i].lifeCycleStarting(this);  
  153.             }  
  154.         }  
  155.     }  
  156.   
  157.     private void setStopping()  
  158.     {  
  159.         _state = STOPPING;  
  160.         if (_listeners != null)  
  161.         {  
  162.             for (int i = 0; i < _listeners.length; i++)  
  163.             {  
  164.                 _listeners[i].lifeCycleStopping(this);  
  165.             }  
  166.         }  
  167.     }  
  168.   
  169.     private void setStopped()  
  170.     {  
  171.         _state = STOPPED;  
  172.         if (_listeners != null)  
  173.         {  
  174.             for (int i = 0; i < _listeners.length; i++)  
  175.             {  
  176.                 _listeners[i].lifeCycleStopped(this);  
  177.             }  
  178.         }  
  179.     }  
  180.   
  181.     private void setFailed(Throwable th)  
  182.     {  
  183.         Log.warn("failed "+this+": "+th);  
  184.         Log.debug(th);  
  185.         _state = FAILED;  
  186.         if (_listeners != null)  
  187.         {  
  188.             for (int i = 0; i < _listeners.length; i++)  
  189.             {  
  190.                 _listeners[i].lifeCycleFailure(this,th);  
  191.             }  
  192.         }  
  193.     }  
  194.   
  195. }  

 3.QueuedThreadPool的实现(在jetty7中该类采用了concurrent包中的许多特性,有空可以对比分析下)。

其中主要的方法为:doStart(),doStop(),newThread(),dispatch(),以及内部类PoolThread的run()和dispatch()方法。

 

Java代码   收藏代码
  1. // ========================================================================  
  2. // Copyright 2004-2005 Mort Bay Consulting Pty. Ltd.  
  3. // ------------------------------------------------------------------------  
  4. // Licensed under the Apache License, Version 2.0 (the "License");  
  5. // you may not use this file except in compliance with the License.  
  6. // You may obtain a copy of the License at   
  7. // http://www.apache.org/licenses/LICENSE-2.0  
  8. // Unless required by applicable law or agreed to in writing, software  
  9. // distributed under the License is distributed on an "AS IS" BASIS,  
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  11. // See the License for the specific language governing permissions and  
  12. // limitations under the License.  
  13. // ========================================================================  
  14.   
  15. package org.mortbay.thread;  
  16.   
  17. import java.io.Serializable;  
  18. import java.util.ArrayList;  
  19. import java.util.HashSet;  
  20. import java.util.Iterator;  
  21. import java.util.List;  
  22. import java.util.Set;  
  23.   
  24. import org.mortbay.component.AbstractLifeCycle;  
  25. import org.mortbay.log.Log;  
  26.   
  27. /* ------------------------------------------------------------ */  
  28. /** A pool of threads. 
  29.  * <p> 
  30.  * Avoids the expense of thread creation by pooling threads after 
  31.  * their run methods exit for reuse. 
  32.  * <p> 
  33.  * If an idle thread is available a job is directly dispatched, 
  34.  * otherwise the job is queued.  After queuing a job, if the total 
  35.  * number of threads is less than the maximum pool size, a new thread  
  36.  * is spawned. 
  37.  * <p> 
  38.  * 
  39.  * @author Greg Wilkins <[email protected]> 
  40.  */  
  41. public class QueuedThreadPool extends AbstractLifeCycle implements Serializable, ThreadPool  
  42. {  
  43.     private String _name;  
  44.     private Set _threads;//线程池里的所有poolThread  
  45.     private List _idle;//空闲的poolThread  
  46.     private Runnable[] _jobs;//等待执行的job(即:工作队列)  
  47.     private int _nextJob;//工作队列中下一个出队的位置  
  48.     private int _nextJobSlot;//工作队列中下一个入队的位置  
  49.     private int _queued;//工作队列的实际长度  
  50.     private int _maxQueued;  
  51.       
  52.     private boolean _daemon;  
  53.     private int _id;  
  54.   
  55.     private final Object _lock = new Lock();//工作队列_jobs和空闲线程_idle队列的锁  
  56.     private final Object _threadsLock = new Lock();//线程池所有线程_threads的锁  
  57.     private final Object _joinLock = new Lock();//  
  58.   
  59.     private long _lastShrink;  
  60.     private int _maxIdleTimeMs=60000;  
  61.     private int _maxThreads=250;  
  62.     private int _minThreads=2;  
  63.     private boolean _warned=false;  
  64.     private int _lowThreads=0;  
  65.     private int _priority= Thread.NORM_PRIORITY;  
  66.     private int _spawnOrShrinkAt=0;  
  67.     private int _maxStopTimeMs;  
  68.   
  69.       
  70.     /* ------------------------------------------------------------------- */  
  71.     /* Construct 
  72.      */  
  73.     public QueuedThreadPool()  
  74.     {  
  75.         _name="qtp-"+hashCode();  
  76.     }  
  77.       
  78.     /* ------------------------------------------------------------------- */  
  79.     /* Construct 
  80.      */  
  81.     public QueuedThreadPool(int maxThreads)  
  82.     {  
  83.         this();  
  84.         setMaxThreads(maxThreads);  
  85.     }  
  86.   
  87.     /* ------------------------------------------------------------ */  
  88.     /** Run job. 
  89.      * @return true  
  90.      */  
  91.     public boolean dispatch(Runnable job)   
  92.     {    
  93.         if (!isRunning() || job==null)  
  94.             return false;  
  95.   
  96.         PoolThread thread=null;  
  97.         boolean spawn=false;  
  98.               
  99.         synchronized(_lock)  
  100.         {  
  101.             // Look for an idle thread  
  102.             int idle=_idle.size();  
  103.             if (idle>0)  
  104.                 thread=(PoolThread)_idle.remove(idle-1);  
  105.             else  
  106.             {  
  107.                 // queue the job  
  108.                 _queued++;//初始值为0  
  109.                 if (_queued>_maxQueued)//当入列的job数大于最大队列数时,更新最大队列数为当前入列个数.  
  110.                     _maxQueued=_queued;  
  111.                 _jobs[_nextJobSlot++]=job;//_jobs[0]=job;   _nextJobSlot = 1; _nextJobSlot表示下一个可以插入_jobs队列的位置。  
  112.                 if (_nextJobSlot==_jobs.length)//  
  113.                     _nextJobSlot=0;  
  114.                 if (_nextJobSlot==_nextJob)//_nextJob表示当前_jobs队列第一个可用的job的位置。_jobs队列已满时,重新扩容(倍增)。  
  115.                 {  
  116.                     // Grow the job queue  
  117.                     Runnable[] jobs= new Runnable[_jobs.length+_maxThreads];//jobs队列倍增  
  118.                     int split=_jobs.length-_nextJob;  
  119.                     if (split>0)  
  120.                         System.arraycopy(_jobs,_nextJob,jobs,0,split);  
  121.                     if (_nextJob!=0)  
  122.                         System.arraycopy(_jobs,0,jobs,split,_nextJobSlot);  
  123.                       
  124.                     _jobs=jobs;  
  125.                     _nextJob=0;  
  126.                     _nextJobSlot=_queued;  
  127.                 }  
  128.                     
  129.                 spawn=_queued>_spawnOrShrinkAt;  
  130.             }  
  131.         }  
  132.           
  133.         if (thread!=null)  
  134.         {  
  135.             thread.dispatch(job);  
  136.         }  
  137.         else if (spawn)  
  138.         {  
  139.             newThread();  
  140.         }  
  141.         return true;  
  142.     }  
  143.   
  144.     /* ------------------------------------------------------------ */  
  145.     /** Get the number of idle threads in the pool. 
  146.      * @see #getThreads 
  147.      * @return Number of threads 
  148.      */  
  149.     public int getIdleThreads()  
  150.     {  
  151.         return _idle==null?0:_idle.size();  
  152.     }  
  153.       
  154.     /* ------------------------------------------------------------ */  
  155.     /** 
  156.      * @return low resource threads threshhold 
  157.      */  
  158.     public int getLowThreads()  
  159.     {  
  160.         return _lowThreads;  
  161.     }  
  162.       
  163.     /* ------------------------------------------------------------ */  
  164.     /** 
  165.      * @return maximum queue size 
  166.      */  
  167.     public int getMaxQueued()  
  168.     {  
  169.         return _maxQueued;  
  170.     }  
  171.       
  172.     /* ------------------------------------------------------------ */  
  173.     /** Get the maximum thread idle time. 
  174.      * Delegated to the named or anonymous Pool. 
  175.      * @see #setMaxIdleTimeMs 
  176.      * @return Max idle time in ms. 
  177.      */  
  178.     public int getMaxIdleTimeMs()  
  179.     {  
  180.         return _maxIdleTimeMs;  
  181.     }  
  182.       
  183.     /* ------------------------------------------------------------ */  
  184.     /** Set the maximum number of threads. 
  185.      * Delegated to the named or anonymous Pool. 
  186.      * @see #setMaxThreads 
  187.      * @return maximum number of threads. 
  188.      */  
  189.     public int getMaxThreads()  
  190.     {  
  191.         return _maxThreads;  
  192.     }  
  193.   
  194.     /* ------------------------------------------------------------ */  
  195.     /** Get the minimum number of threads. 
  196.      * Delegated to the named or anonymous Pool. 
  197.      * @see #setMinThreads 
  198.      * @return minimum number of threads. 
  199.      */  
  200.     public int getMinThreads()  
  201.     {  
  202.         return _minThreads;  
  203.     }  
  204.   
  205.     /* ------------------------------------------------------------ */  
  206.     /**  
  207.      * @return The name of the BoundedThreadPool. 
  208.      */  
  209.     public String getName()  
  210.     {  
  211.         return _name;  
  212.     }  
  213.   
  214.     /* ------------------------------------------------------------ */  
  215.     /** Get the number of threads in the pool. 
  216.      * @see #getIdleThreads 
  217.      * @return Number of threads 
  218.      */  
  219.     public int getThreads()  
  220.     {  
  221.         return _threads.size();  
  222.     }  
  223.   
  224.     /* ------------------------------------------------------------ */  
  225.     /** Get the priority of the pool threads. 
  226.      *  @return the priority of the pool threads. 
  227.      */  
  228.     public int getThreadsPriority()  
  229.     {  
  230.         return _priority;  
  231.     }  
  232.   
  233.     /* ------------------------------------------------------------ */  
  234.     public int getQueueSize()  
  235.     {  
  236.         return _queued;  
  237.     }  
  238.       
  239.     /* ------------------------------------------------------------ */  
  240.     /** 
  241.      * @return the spawnOrShrinkAt  The number of queued jobs (or idle threads) needed  
  242.      * before the thread pool is grown (or shrunk) 
  243.      */  
  244.     public int getSpawnOrShrinkAt()  
  245.     {  
  246.         return _spawnOrShrinkAt;  
  247.     }  
  248.   
  249.     /* ------------------------------------------------------------ */  
  250.     /** 
  251.      * @param spawnOrShrinkAt The number of queued jobs (or idle threads) needed  
  252.      * before the thread pool is grown (or shrunk) 
  253.      */  
  254.     public void setSpawnOrShrinkAt(int spawnOrShrinkAt)  
  255.     {  
  256.         _spawnOrShrinkAt=spawnOrShrinkAt;  
  257.     }  
  258.   
  259.     /* ------------------------------------------------------------ */  
  260.     /** 
  261.      * @return maximum total time that stop() will wait for threads to die. 
  262.      */  
  263.     public int getMaxStopTimeMs()  
  264.     {  
  265.         return _maxStopTimeMs;  
  266.     }  
  267.   
  268.     /* ------------------------------------------------------------ */  
  269.     /** 
  270.      * @param stopTimeMs maximum total time that stop() will wait for threads to die. 
  271.      */  
  272.     public void setMaxStopTimeMs(int stopTimeMs)  
  273.     {  
  274.         _maxStopTimeMs = stopTimeMs;  
  275.     }  
  276.   
  277.     /* ------------------------------------------------------------ */  
  278.     /**  
  279.      * Delegated to the named or anonymous Pool. 
  280.      */  
  281.     public boolean isDaemon()  
  282.     {  
  283.         return _daemon;  
  284.     }  
  285.   
  286.     /* ------------------------------------------------------------ */  
  287.     public boolean isLowOnThreads()  
  288.     {  
  289.         return _queued>_lowThreads;  
  290.     }  
  291.   
  292.     /* ------------------------------------------------------------ */  
  293.     public void join() throws InterruptedException  
  294.     {  
  295.         synchronized (_joinLock)  
  296.         {  
  297.             while (isRunning()){  
  298.                 _joinLock.wait();  
  299.             }  
  300.         }  
  301.           
  302.         // TODO remove this semi busy loop!  
  303.         while (isStopping()){  
  304.             Thread.sleep(100);  
  305.         }  
  306.     }  
  307.   
  308.     /* ------------------------------------------------------------ */  
  309.     /**  
  310.      * Delegated to the named or anonymous Pool. 
  311.      */  
  312.     public void setDaemon(boolean daemon)  
  313.     {  
  314.         _daemon=daemon;  
  315.     }  
  316.   
  317.     /* ------------------------------------------------------------ */  
  318.     /** 
  319.      * @param lowThreads low resource threads threshhold 
  320.      */  
  321.     public void setLowThreads(int lowThreads)  
  322.     {  
  323.         _lowThreads = lowThreads;  
  324.     }  
  325.       
  326.     /* ------------------------------------------------------------ */  
  327.     /** Set the maximum thread idle time. 
  328.      * Threads that are idle for longer than this period may be 
  329.      * stopped. 
  330.      * Delegated to the named or anonymous Pool. 
  331.      * @see #getMaxIdleTimeMs 
  332.      * @param maxIdleTimeMs Max idle time in ms. 
  333.      */  
  334.     public void setMaxIdleTimeMs(int maxIdleTimeMs)  
  335.     {  
  336.         _maxIdleTimeMs=maxIdleTimeMs;  
  337.     }  
  338.   
  339.     /* ------------------------------------------------------------ */  
  340.     /** Set the maximum number of threads. 
  341.      * Delegated to the named or anonymous Pool. 
  342.      * @see #getMaxThreads 
  343.      * @param maxThreads maximum number of threads. 
  344.      */  
  345.     public void setMaxThreads(int maxThreads)  
  346.     {  
  347.         if (isStarted() && maxThreads<_minThreads)  
  348.             throw new IllegalArgumentException("!minThreads<maxThreads");  
  349.         _maxThreads=maxThreads;  
  350.     }  
  351.   
  352.     /* ------------------------------------------------------------ */  
  353.     /** Set the minimum number of threads. 
  354.      * Delegated to the named or anonymous Pool. 
  355.      * @see #getMinThreads 
  356.      * @param minThreads minimum number of threads 
  357.      */  
  358.     public void setMinThreads(int minThreads)  
  359.     {  
  360.         if (isStarted() && (minThreads<=0 || minThreads>_maxThreads))  
  361.             throw new IllegalArgumentException("!0<=minThreads<maxThreads");  
  362.         _minThreads=minThreads;  
  363.         synchronized (_threadsLock)  
  364.         {  
  365.             while (isStarted() && _threads.size()<_minThreads)  
  366.             {  
  367.                 newThread();     
  368.             }  
  369.         }  
  370.     }  
  371.   
  372.     /* ------------------------------------------------------------ */  
  373.     /**  
  374.      * @param name Name of the BoundedThreadPool to use when naming Threads. 
  375.      */  
  376.     public void setName(String name)  
  377.     {  
  378.         _name= name;  
  379.     }  
  380.   
  381.     /* ------------------------------------------------------------ */  
  382.     /** Set the priority of the pool threads. 
  383.      *  @param priority the new thread priority. 
  384.      */  
  385.     public void setThreadsPriority(int priority)  
  386.     {  
  387.         _priority=priority;  
  388.     }  
  389.   
  390.     /* ------------------------------------------------------------ */  
  391.     /* Start the BoundedThreadPool. 
  392.      * Construct the minimum number of threads. 
  393.      */  
  394.     protected void doStart() throws Exception  
  395.     {  
  396.         if (_maxThreads<_minThreads || _minThreads<=0)  
  397.             throw new IllegalArgumentException("!0<minThreads<maxThreads");  
  398.           
  399.         _threads=new HashSet();  
  400.         _idle=new ArrayList();  
  401.         _jobs=new Runnable[_maxThreads];//按照最大线程数创建的工作队列  
  402.           
  403.         for (int i=0;i<_minThreads;i++)//按最小线程数创建的poolThread  
  404.         {  
  405.             newThread();  
  406.         }     
  407.     }  
  408.   
  409.     /* ------------------------------------------------------------ */  
  410.     /** Stop the BoundedThreadPool. 
  411.      * New jobs are no longer accepted,idle threads are interrupted 
  412.      * and stopJob is called on active threads. 
  413.      * The method then waits  
  414.      * min(getMaxStopTimeMs(),getMaxIdleTimeMs()), for all jobs to 
  415.      * stop, at which time killJob is called. 
  416.      */  
  417.     protected void doStop() throws Exception  
  418.     {     
  419.         super.doStop();  
  420.           
  421.         long start=System.currentTimeMillis();  
  422.         for (int i=0;i<100;i++)  
  423.         {  
  424.             synchronized (_threadsLock)  
  425.             {  
  426.                 Iterator iter = _threads.iterator();  
  427.                 while (iter.hasNext())  
  428.                     ((Thread)iter.next()).interrupt();  
  429.             }  
  430.               
  431.             Thread.yield();  
  432.             if (_threads.size()==0 || (_maxStopTimeMs>0 && _maxStopTimeMs < (System.currentTimeMillis()-start)))  
  433.                break;  
  434.               
  435.             try  
  436.             {  
  437.                 Thread.sleep(i*100);  
  438.             }  
  439.             catch(InterruptedException e){}  
  440.               
  441.               
  442.         }  
  443.   
  444.         // TODO perhaps force stops  
  445.         if (_threads.size()>0)  
  446.             Log.warn(_threads.size()+" threads could not be stopped");  
  447.           
  448.         synchronized (_joinLock)  
  449.         {  
  450.             _joinLock.notifyAll();  
  451.         }  
  452.     }  
  453.   
  454.     /* ------------------------------------------------------------ */  
  455.     protected void newThread()  
  456.     {  
  457.         synchronized (_threadsLock)  
  458.         {  
  459.             if (_threads.size()<_maxThreads)  
  460.             {  
  461.                 PoolThread thread =new PoolThread();  
  462.                 _threads.add(thread);//添加到线程池中  
  463.                 thread.setName(thread.hashCode()+"@"+_name+"-"+_id++);//线程name = 线程hashCode + @ + 线程池名字  + 线程在线程池中的序号(递增)  
  464.                 thread.start();   
  465.             }  
  466.             else if (!_warned)      
  467.             {  
  468.                 _warned=true;  
  469.                 Log.debug("Max threads for {}",this);  
  470.             }  
  471.         }  
  472.     }  
  473.   
  474.     /* ------------------------------------------------------------ */  
  475.     /** Stop a Job. 
  476.      * This method is called by the Pool if a job needs to be stopped. 
  477.      * The default implementation does nothing and should be extended by a 
  478.      * derived thread pool class if special action is required. 
  479.      * @param thread The thread allocated to the job, or null if no thread allocated. 
  480.      * @param job The job object passed to run. 
  481.      */  
  482.     protected void stopJob(Thread thread, Object job)  
  483.     {  
  484.         thread.interrupt();  
  485.     }  
  486.       
  487.   
  488.     /* ------------------------------------------------------------ */  
  489.     public String dump()  
  490.     {  
  491.         StringBuffer buf = new StringBuffer();  
  492.   
  493.         synchronized (_threadsLock)  
  494.         {  
  495.             for (Iterator i=_threads.iterator();i.hasNext();)  
  496.             {  
  497.                 Thread thread = (Thread)i.next();  
  498.                 buf.append(thread.getName()).append(" ").append(thread.toString()).append('\n');  
  499.             }  
  500.         }  
  501.           
  502.         return buf.toString();  
  503.     }  
  504.       
  505.     /* ------------------------------------------------------------ */  
  506.     /** 
  507.      * @param name The thread name to stop. 
  508.      * @return true if the thread was found and stopped. 
  509.      * @Deprecated Use {@link #interruptThread(long)} in preference 
  510.      */  
  511.     public boolean stopThread(String name)  
  512.     {  
  513.         synchronized (_threadsLock)  
  514.         {  
  515.             for (Iterator i=_threads.iterator();i.hasNext();)  
  516.             {  
  517.                 Thread thread = (Thread)i.next();  
  518.                 if (name.equals(thread.getName()))  
  519.                 {  
  520.                     thread.stop();  
  521.                     return true;  
  522.                 }  
  523.             }  
  524.         }  
  525.         return false;  
  526.     }  
  527.       
  528.     /* ------------------------------------------------------------ */  
  529.     /** 
  530.      * @param name The thread name to interrupt. 
  531.      * @return true if the thread was found and interrupted. 
  532.      */  
  533.     public boolean interruptThread(String name)  
  534.     {  
  535.         synchronized (_threadsLock)  
  536.         {  
  537.             for (Iterator i=_threads.iterator();i.hasNext();)  
  538.             {  
  539.                 Thread thread = (Thread)i.next();  
  540.                 if (name.equals(thread.getName()))  
  541.                 {  
  542.                     thread.interrupt();  
  543.                     return true;  
  544.                 }  
  545.             }  
  546.         }  
  547.         return false;  
  548.     }  
  549.   
  550.     /* ------------------------------------------------------------ */  
  551.     /** Pool Thread class. 
  552.      * The PoolThread allows the threads job to be 
  553.      * retrieved and active status to be indicated. 
  554.      */  
  555.     public class PoolThread extends Thread   
  556.     {  
  557.         Runnable _job=null;//线程池通过内部类的成员变量进行交互  
  558.   
  559.         /* ------------------------------------------------------------ */  
  560.         PoolThread()  
  561.         {  
  562.             setDaemon(_daemon);  
  563.             setPriority(_priority);  
  564.         }  
  565.           
  566.         /* ------------------------------------------------------------ */  
  567.         /** BoundedThreadPool run. 
  568.          * Loop getting jobs and handling them until idle or stopped. 
  569.          */  
  570.         public void run()  
  571.         {  
  572.             boolean idle=false;//  
  573.             Runnable job=null;//独立于线程  
  574.             try  
  575.             {  
  576.                 while (isRunning())  
  577.                 {     
  578.                     // Run any job that we have.  
  579.                     if (job!=null)  
  580.                     {  
  581.                         final Runnable todo=job;  
  582.                         job=null;  
  583.                         idle=false;  
  584.                         todo.run();  
  585.                     }  
  586.                       
  587.                     synchronized(_lock)  
  588.                     {  
  589.                         // is there a queued job?  
  590.                         if (_queued>0)  
  591.                         {  
  592.                             _queued--;  
  593.                             job=_jobs[_nextJob];  
  594.                             _jobs[_nextJob++]=null;  
  595.                             if (_nextJob==_jobs.length)  
  596.                                 _nextJob=0;  
  597.                             continue;  
  598.                         }  
  599.   
  600.                         // Should we shrink?  
  601.                         final int threads=_threads.size();  
  602.                         if (threads>_minThreads &&   
  603.                             (threads>_maxThreads ||   
  604.                              _idle.size()>_spawnOrShrinkAt))     
  605.                         {  
  606.                             long now = System.currentTimeMillis();  
  607.                             if ((now-_lastShrink)>getMaxIdleTimeMs())  
  608.                             {  
  609.                                 _lastShrink=now;  
  610.                                 _idle.remove(this);  
  611.                                 return;  
  612.                             }  
  613.                         }  
  614.   
  615.                         if (!idle)  
  616.                         {     
  617.                             // Add ourselves to the idle set.  
  618.                             _idle.add(this);  
  619.                             idle=true;  
  620.                         }  
  621.                     }  
  622.   
  623.                     // We are idle  
  624.                     // wait for a dispatched job  
  625.                     synchronized (this)  
  626.                     {  
  627.                         if (_job==null)  
  628.                             this.wait(getMaxIdleTimeMs());  
  629.                         job=_job;  
  630.                         _job=null;  
  631.                     }  
  632.                 }  
  633.             }  
  634.             catch (InterruptedException e)  
  635.             {  
  636.                 Log.ignore(e);  
  637.             }  
  638.             finally  
  639.             {  
  640.                 synchronized (_lock)  
  641.                 {  
  642.                     _idle.remove(this);  
  643.                 }  
  644.                 synchronized (_threadsLock)  
  645.                 {  
  646.                     _threads.remove(this);  
  647.                 }  
  648.                 synchronized (this)  
  649.                 {  
  650.                     job=_job;  
  651.                 }  
  652.                   
  653.                 // we died with a job! reschedule it  
  654.                 if (job!=null)  
  655.                 {  
  656.                     //此处是因为内部类和外部类有同名的方法,否则,直接调用即可.  
  657.                     //调用外部类对象(线程池)的dispatch()方法,而不是内部类对象(PoolThread线程)的dispatch()方法  
  658.                     QueuedThreadPool.this.dispatch(job);  
  659.                 }  
  660.             }  
  661.         }  
  662.           
  663.         /* ------------------------------------------------------------ */  
  664.         void dispatch(Runnable job)  
  665.         {  
  666.             synchronized (this)  
  667.             {  
  668.                 _job=job;  
  669.                 this.notify();  
  670.             }  
  671.         }  
  672.     }  
  673.   
  674.     private class Lock{}  
  675. }  

  4.QueuedThreadPoolTest测试类,调用QueuedThreadPool对象的start()方法启动线程池,调用dispatch()方法分发任务。

 

Java代码   收藏代码
  1. package com.iteye.suo.jetty.thread;  
  2. import org.mortbay.thread.QueuedThreadPool;  
  3. public class QueuedThreadPoolTest {  
  4.   
  5.     public static void main(String[] args) throws Exception {  
  6.         QueuedThreadPool pool = new QueuedThreadPool();  
  7.         pool.start();  
  8.           
  9.         for(int i=0;i<20;i++){  
  10.             final int num = i;  
  11.             pool.dispatch(new Runnable(){  
  12.                 public void run() {  
  13.                     System.out.println(Thread.currentThread().getName() + " loop of " + num);  
  14.                 }  
  15.             });  
  16.         }  
  17.         System.out.println("done!");  
  18.         //如何停止pool?这样停止的话,若线程池里有任务,将会被中断。  
  19.         pool.stop();  
  20.     }  
  21. }  
 

 原文http://suo.iteye.com/blog/1390134

你可能感兴趣的:(java,线程,jetty)