首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

线程池代码完整辨析(一)

2012-12-26 
线程池代码完整剖析(一)线程池代码完整剖析(一)一、概述??? ?Jetty一个重要的组件就是线程池,本文主要是围

线程池代码完整剖析(一)

线程池代码完整剖析(一)

一、概述

?

?? ?Jetty一个重要的组件就是线程池,本文主要是围绕源代码是怎样开发一个线程池,因为有一个任务需要处理,就直接从线程池里面取出一个线程,这样就加快应用程序的速度。

要开发一个线程池主要要注意的几个地方:

?

1、先要定义一个集合,这个集合主要是保存线程池里面的线程数目

2、因为线程池里面的线程不可能所有的线程都需要工作,所以要在定义一个集合专门用来保存线程池里面空闲的线程

3、然后,开发中不可能线程越多越好,这样会影响应用程序的性能,所以必须要定义变量,线程池中最大的线程和最小的线 ? ? ? 程数目

4、如果任务的请求量已经把线程池中的线程数目都占有(没有了空闲线程),那么必须定义一个队列:把请求的任务存放在队列中,等有空闲的线程,在从队列中取出来。

5、如果队列的任务已经很多(必须限制队列的长度)来不及处理,这样会影响任务处理的速度

6、如果线程池中的数目空闲线程已经达到了线程池中最小的数目时候,必须要清理一些空闲的线程,就需要定义线程的生命周 期。

7、必须要妥善的处理线程池中的数目,在什么时候线程池的数目要增加,在什么情况下线程池中的数目要减少

8、如何安全的关闭一个线程

9、涉及到多线程问题,代码块如何进行同步

?

在这里举出了九个问题,读者可以带着九个问题思考,看Jetty线程池代码是如何解决。

?

二、讲述源代码

?

Jetty中实现线程池就用了一个接口和一个实现的类。

?

下面为了说明问题先讲一个组件:LifeCycle--就是Jetty是如何优雅的实现每个组件开启和关闭

?

下面看LifeCycle接口源代码:

?

public abstract class AbstractLifeCycle implements LifeCycle{//这个也是抽象类加锁的一个解决方案    private Object _lock = new Object();    private final int FAILED = -1, STOPPED = 0, STARTING = 1, STARTED = 2, STOPPING = 3;    private transient int _state = STOPPED;    protected LifeCycle.Listener[] _listeners;    protected void doStart() throws Exception    {    }    protected void doStop() throws Exception    {    }    public final void start() throws Exception    {        synchronized (this)        {            try            {                if (_state == STARTED || _state == STARTING)                    return;                setStarting();                doStart();                Log.debug("started {}",this);                setStarted();            }            catch (Exception e)            {                setFailed(e);                throw e;            }            catch (Error e)            {                setFailed(e);                throw e;            }        }    }    public final void stop() throws Exception    {        synchronized (_lock)        {            try            {                if (_state == STOPPING || _state == STOPPED)                    return;                setStopping();                doStop();                Log.debug("stopped {}",this);                setStopped();            }            catch (Exception e)            {                setFailed(e);                throw e;            }            catch (Error e)            {                setFailed(e);                throw e;            }        }    }    public boolean isRunning()    {        return _state == STARTED || _state == STARTING;    }    public boolean isStarted()    {        return _state == STARTED;    }    public boolean isStarting()    {        return _state == STARTING;    }    public boolean isStopping()    {        return _state == STOPPING;    }    public boolean isStopped()    {        return _state == STOPPED;    }    public boolean isFailed()    {        return _state == FAILED;    }    public void addLifeCycleListener(LifeCycle.Listener listener)    {        _listeners = (LifeCycle.Listener[])LazyList.addToArray(_listeners,listener,LifeCycle.Listener.class);    }    public void removeLifeCycleListener(LifeCycle.Listener listener)    {        LazyList.removeFromArray(_listeners,listener);    }    private void setStarted()    {        _state = STARTED;        if (_listeners != null)        {            for (int i = 0; i < _listeners.length; i++)            {                _listeners[i].lifeCycleStarted(this);            }        }    }    private void setStarting()    {        _state = STARTING;        if (_listeners != null)        {            for (int i = 0; i < _listeners.length; i++)            {                _listeners[i].lifeCycleStarting(this);            }        }    }    private void setStopping()    {        _state = STOPPING;        if (_listeners != null)        {            for (int i = 0; i < _listeners.length; i++)            {                _listeners[i].lifeCycleStopping(this);            }        }    }    private void setStopped()    {        _state = STOPPED;        if (_listeners != null)        {            for (int i = 0; i < _listeners.length; i++)            {                _listeners[i].lifeCycleStopped(this);            }        }    }    private void setFailed(Throwable th)    {        Log.warn("failed "+this+": "+th);        Log.debug(th);        _state = FAILED;        if (_listeners != null)        {            for (int i = 0; i < _listeners.length; i++)            {                _listeners[i].lifeCycleFailure(this,th);            }        }    }}

??private final int FAILED = -1, STOPPED = 0, STARTING = 1, STARTED = 2, STOPPING = 3;

?? ?private transient int _state = STOPPED;

?? ?protected LifeCycle.Listener[] _listeners;

_state是组件的状态变量,变量的值在上面所示,而组件所监听的事件是用一个数组表示?LifeCycle.Listener[] _listeners,还需要注意的是该抽象类定义了一个模板方法,doStart()和doStop()方法,具体代码留给实现的子类实现。

该设计就是典型的设计模式模板方法。。。。。还要注意的是LazyList类是Jetty定义的一个类,封装了一个集合。

?

下面具体剖析请看续集。。。。

?

?

?

热点排行