- <capsd-configuration
- rescan-frequency="86400000"
- initial-sleep-time="30000"
- max-suspect-thread-pool-size="10"
- max-rescan-thread-pool-size="10">
其中的max-suspect-thread-pool-size就定義了可以同時對多少個IP地址進行服務掃描,而max-rescan-thread-pool-size則定義了可以同時對多少個IP進行服務重新掃描。
本文將從源碼來剖析其線程池的實現機制。在OpenNMS的代碼中,是通過RunnableConsumerThreadPool來實現線程池的,我們首先看下該類是如何被使用的。
- m_runner = new RunnableConsumerThreadPool("Test Pool", 0.6f, 1.0f,10);
首先創建一個線程池對象,構造函數的4個參數,第一個和最後一個比較好解釋,第一個就是線程池名字,給個名字主要在日誌中比較好區分各個線程的執行軌跡,最後一個參數就是定義線程池的大小。第二個和第三個參數稍微解釋下,它們分別定義了兩個分水嶺(或稱預置),其實就是當前線程池負載情況。爲解釋這兩個參數,首先需要定義幾個概念:
- 等待調度對象: 等待調度對象就是所有需要執行的對象,它們最終都要進入線程池由線程池分配一個線程來執行
- 線程池: 線程池是所有線程的一個容器,它同時負責線程的創建、調度及銷燬
- 線程: 線程不同於等待調度對象,它是物理可執行的對象,它負責最終執行等待調度對象,而且一般情況下,線程數都小於等待調度對象數目
有了上面幾個概念,就比較好解釋那兩個參數了,這兩個參數分別成爲低水印值和高水印值,它的取值實際上是等待調度對象與線程池中線程數的比值。低水印值的含義是當比值小於這個值後,即等待調度對象少於線程池中線程數且達到某個度時,則需要銷燬一些線程池中的線程數,以減少系統負載。而高水印值的含義則是當比值大於這個值後,在不超出線程池大小的前提下,增加線程池中線程數。所以一般情況下高水印值都是取1。
下面開始深入線程池的內部了,首先線程池是用了一個先進先出隊列來保存等待調度對象,
- private SizingFifoQueue<Runnable> m_delegateQ;
用一個簡單的數組來保存線程池,
- private Fiber[] m_fibers;
- private float m_hiRatio;
- private float m_loRatio;
- private int m_maxSize;
上面除了保存線程的數組外,另外三個變量依次表示高水印值,低水印值及線程池大小。
在下一篇文章中將介紹線程池的具體操作流程。
本文出自http://njulinq.blog.51cto.com/1257169/283585