如何建立處理器池之享元模式

小鞅發表於2016-04-19

最近在看tomcat原始碼的時候發現裡面有很多經典設計模式的運用案例,正好趁此機會熟悉一下設計模式,為了保證程式碼原味性,就直接複製貼上了,以下程式碼不能執行,但是能看明白,可以用來學習和借鑑。


相關設計模式:享元模式


//最少處理器個數
protected int minProcessors = 5;
//最大處理器個數
private int maxProcessors = 20;
//當前處理器個數
private int curProcessors = 0;
//用於存放使用完的處理器
private Stack<Object> processors = new Stack<Object>();
//用於存放新建立的處理器
private Vector<Object> created = new Vector<Object>();
/** 
     * 處理器使用完以後將處理器加入處理器池中,
     * @author fjding 
     * @date 2016年4月18日 下午10:04:54 
     * @param processor
     * =================Modify Record=================
     * @Modifier    @date                   @Content
     * fjding     2016年4月18日 下午10:04:54 新建
     * 
     */ 
    private void recycle(HttpProcessor processor) {

        processors.push(processor);

    }


    // 

    /** 
     * 通過該方法可以獲得處理器池中的執行緒
     * @author fjding 
     * @date 2016年4月18日 下午10:05:59 
     * @return
     * =================Modify Record=================
     * @Modifier    @date                   @Content
     * fjding     2016年4月18日 下午10:05:59 新建
     * 
     */ 
    private HttpProcessor createProcessor() {

        synchronized (processors) {
          //池中有處理器可用
            if (processors.size() > 0) {

                return ((HttpProcessor) processors.pop());
            }
            //如果處理器池中沒有可以用的處理器,則判斷當前的處理器個數(此時池中是空的)是否大於設定最大處理器個數,

            if ((maxProcessors > 0) && (curProcessors < maxProcessors)) {
                //沒有則建立
                return (newProcessor());
            } else {
              //如果處理器最大個數被設定為-1,則要多少個處理器就建立多少個,不受限制
                if (maxProcessors < 0) {

                    return (newProcessor());

                } else {

                    return (null);
                }
            }
        }
    }

    /** 
     * 建立一個新的處理器
     * @author fjding 
     * @date 2016年4月18日 下午10:25:36 
     * @return
     * =================Modify Record=================
     * @Modifier    @date                   @Content
     * fjding     2016年4月18日 下午10:25:36 新建
     * 
     */ 
    private HttpProcessor newProcessor() {

       //當建立一個處理器,則當前處理器標記加1,給改處理器設定了個名字,執行緒也是這麼做的
        HttpProcessor processor = new HttpProcessor(this, curProcessors++);
        if (processor instanceof Lifecycle) {
            try {
                ((Lifecycle) processor).start();
            } catch (Exception e) {
                log("newProcessor", e);
                return (null);
            }
        }
        created.addElement(processor);
        return (processor);

    }
<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

相關文章