`
he_wen
  • 浏览: 238646 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

阅读更多

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

一、概述

 

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

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

 

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

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

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

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

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

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

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

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

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

 

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

 

二、讲述源代码

 

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

 

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

 

下面看LifeCycle接口源代码:

 

public interface LifeCycle
{
    /* ------------------------------------------------------------ */
    /**
     * Starts the component.
     * @throws Exception If the component fails to start
     * @see #isStarted()
     * @see #stop()
     * @see #isFailed()
     */
    public void start()
        throws Exception;

    /* ------------------------------------------------------------ */
    /**
     * Stops the component.
     * The component may wait for current activities to complete
     * normally, but it can be interrupted.
     * @exception Exception If the component fails to stop
     * @see #isStopped()
     * @see #start()
     * @see #isFailed()
     */
    public void stop()
        throws Exception;

    /* ------------------------------------------------------------ */
    /**
     * @return true if the component is starting or has been started.
     */
    public boolean isRunning();

    /* ------------------------------------------------------------ */
    /**
     * @return true if the component has been started.
     * @see #start()
     * @see #isStarting()
     */
    public boolean isStarted();

    /* ------------------------------------------------------------ */
    /**
     * @return true if the component is starting.
     * @see #isStarted()
     */
    public boolean isStarting();

    /* ------------------------------------------------------------ */
    /**
     * @return true if the component is stopping.
     * @see #isStopped()
     */
    public boolean isStopping();

    /* ------------------------------------------------------------ */
    /**
     * @return true if the component has been stopped.
     * @see #stop()
     * @see #isStopping()
     */
    public boolean isStopped();

    /* ------------------------------------------------------------ */
    /**
     * @return true if the component has failed to start or has failed to stop.
     */
    public boolean isFailed();
    
    /* ------------------------------------------------------------ */
    public void addLifeCycleListener(LifeCycle.Listener listener);

    /* ------------------------------------------------------------ */
    public void removeLifeCycleListener(LifeCycle.Listener listener);
    

    /* ------------------------------------------------------------ */
    /** Listener.
     * A listener for Lifecycle events.
     */
    public interface Listener extends EventListener
    {
        public void lifeCycleStarting(LifeCycle event);
        public void lifeCycleStarted(LifeCycle event);
        public void lifeCycleFailure(LifeCycle event,Throwable cause);
        public void lifeCycleStopping(LifeCycle event);
        public void lifeCycleStopped(LifeCycle event);
    }
}

 

该接口里面有一个内部接口Listener,主要是外面注册监听事件:组件是正在开始、已经开始、正在停止、已经停止、失败了,全部依赖这五个方法。

下面是实现这个接口的抽象类:AbstractLifeCycle

代码请看下面:

 

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定义的一个类,封装了一个集合。

 

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

 

 

 

4
2
分享到:
评论

相关推荐

    c++线程池的实现代码

    线程池是一种多线程处理形式,通过维护一组可重用线程来提高程序执行效率。...通过分析和理解这个库的源代码,开发者可以学习如何在C++中实现一个高效、跨平台的线程池,这在多线程编程中是非常有价值的技能。

    100行Java代码构建一个线程池

    在示例代码中,作者使用简单的Java代码创建了一个线程池,通过`ThreadPoolManager`类来管理线程池,并使用`SimpleThread`类作为处理任务的线程。 【示例代码分析】 1. `TestThreadPool`类是测试类,模拟客户端发送...

    一个简单线程池的实现

    线程池是一种在多线程编程中非常重要的概念,它能有效地管理和调度系统中的线程资源,从而提高系统的效率和响应...不过要注意,由于存在bug,我们需要仔细分析代码,找出问题所在,并进行修正,以使其更稳定和高效。

    glib库异步队列和线程池代码分析

    ### glib库异步队列和线程池代码分析 #### 一、异步队列原理与实现 异步队列是一种高效的线程间通信机制,用于在多线程环境中同步共享数据。它通过将数据组织成队列的形式,允许线程在不阻塞的情况下进行读写操作...

    Linux线程池代码.zip

    在"Linux线程池代码.zip"这个压缩包中,我们可以期待找到一个用C语言编写的线程池实现。线程池的核心概念包括以下几个部分: 1. **线程池初始化**:程序启动时,首先会创建一个线程池,这个过程需要指定线程池的...

    线程池示例代码

    分析这些示例可以帮助理解线程池的工作原理和最佳实践。 `www.pudn.com.txt`可能是一个链接或介绍资源的文本文件,通常在分享代码时用于提供额外的上下文或参考资料。它可能指向了关于线程池的讨论、文章或者更多的...

    c++线程池类代码实现

    ### C++线程池类代码实现 #### 一、概览 本文将深入解析一个C++线程池类(`CThreadPoolExecutor`)及其部分成员函数的实现细节。该线程池类为初学者提供了一个良好的学习示例,有助于理解线程池的基本原理和在C++中...

    Python的线程池实现

    在Python编程中,线程池是一种管理多个线程并发执行任务的有效工具,它允许程序员预先定义好线程的数量,然后将一系列的任务提交到线程池中,由线程池自动调度执行。线程池的使用可以减少创建和销毁线程的开销,提高...

    线程池代码

    分析这个代码可以帮助深入理解线程池的工作原理和实现细节,例如任务的提交方式、线程的管理和调度机制等。通过对这些代码的阅读和学习,可以提升对多线程编程和线程池的理解,进一步优化并发应用程序的性能。

    C++实现线程池详解(基于boost源码以及封装等线程池)

    三、简单的C++线程池代码示例 四、 基于boost编写的源码库 - 线程池 4.1 基于boost编写的源码库地址 4.2 boost线程池的先进先出、后进先出、优先级代码示例 五、看看人家线程池怎么写的 - 要理解精髓 六、线程池应用...

    c++实现的线程池源代码threadpool

    线程池是一种在多线程编程中常用的管理...通过分析和实践这些源代码,可以深入理解C++中的多线程编程和线程池机制,这对于编写高效的并发程序至关重要。同时,这也是提升C++编程能力,特别是系统级编程能力的好机会。

    免积分C++11写的可复用的线程池类 - 开源

    标题中的“免积分C++11写的可复用的线程池类 - 开源”意味着这是一个使用C++11标准库实现的线程池类,它具有可复用性,并且是开源的,允许开发者查看和修改源代码,以便根据项目需求进行定制。 线程池是一种多线程...

    JDK自带线程池分析

    JDK自带线程池分析 JDK 自带线程池是 Java 语言中用于管理和执行线程的工具,旨在提高多线程编程的效率和灵活性。本文将详细介绍 JDK 自带线程池的组成、创建方法、优点和常见应用场景。 多线程技术 多线程技术是...

    基于liunx操作系统的线程池项目

    在Linux操作系统中,线程池是一种高效的资源管理策略,它通过预先创建一组可重用的线程来处理并发任务,从而避免频繁地创建和销毁线程带来的开销。本项目"基于Linux操作系统的线程池项目"是为初学者设计的,旨在帮助...

    c++11线程与线程池Demo 完整vs2013工程

    C++11是C++语言的一个重要版本更新,它引入了大量的新特性,其中包括对多线程...通过分析和运行这个示例工程,开发者不仅可以深化对C++11线程API的理解,还能掌握如何在实际项目中应用线程池这一高效的并发控制机制。

    VC6.0线程池,参考别人代码实现

    在C++编程中,线程池是一种...通过深入理解并分析提供的“ThreadPool”代码,开发者可以学习到如何在VC6.0环境下实现线程池,以及如何在C++中进行多线程编程。这对于提升程序的并发性能和优化资源使用具有重要意义。

    Java中线程池框架核心代码分析

    Java中线程池框架核心代码分析

    Java线程池完整代码,已经用于实际的项目中,性能稳定.zip

    总之,这个压缩包中的代码提供了自定义线程池的实现,通过分析`ThreadPool.java`、`PooledThread.java`和`ThreadTask.java`,我们可以学习如何构建、管理和优化线程池,以适应各种并发场景的需求。在实际项目中,...

    用c写的一个关于线程池的代码

    线程池是一种多线程处理形式,通过维护一组可重用线程来处理并发任务,以提高系统的效率和响应速度。在本项目中,我们关注的是一个使用C语言实现的...通过阅读和分析代码,可以深入理解多线程编程和线程池管理技术。

Global site tag (gtag.js) - Google Analytics