OpenNMS全接觸-線程池(五)

爲提高系統效率,OpenNMS在很多模塊中啓用了多線程,並通過線程池來對這些線程進行管理。而且具體線程數可以通過配置文件進行配置,例如在%OpenNMS_HOME%/etc/capsd-configuration.xml文件中,就可以對網絡服務發現和服務重新掃描的線程數進行配置:

 

  1. <capsd-configuration  
  2.     rescan-frequency="86400000"  
  3.     initial-sleep-time="30000"  
  4.     max-suspect-thread-pool-size="10" 
  5.         max-rescan-thread-pool-size="10"> 

其中的max-suspect-thread-pool-size就定義了可以同時對多少個IP地址進行服務掃描,而max-rescan-thread-pool-size則定義了可以同時對多少個IP進行服務重新掃描。

本文將從源碼來剖析其線程池的實現機制。在OpenNMS的代碼中,是通過RunnableConsumerThreadPool來實現線程池的,我們首先看下該類是如何被使用的。

 

  1. m_runner = new RunnableConsumerThreadPool("Test Pool"0.6f, 1.0f,10); 

首先創建一個線程池對象,構造函數的4個參數,第一個和最後一個比較好解釋,第一個就是線程池名字,給個名字主要在日誌中比較好區分各個線程的執行軌跡,最後一個參數就是定義線程池的大小。第二個和第三個參數稍微解釋下,它們分別定義了兩個分水嶺(或稱預置),其實就是當前線程池負載情況。爲解釋這兩個參數,首先需要定義幾個概念:

  1. 等待調度對象: 等待調度對象就是所有需要執行的對象,它們最終都要進入線程池由線程池分配一個線程來執行
  2. 線程池: 線程池是所有線程的一個容器,它同時負責線程的創建、調度及銷燬
  3. 線程: 線程不同於等待調度對象,它是物理可執行的對象,它負責最終執行等待調度對象,而且一般情況下,線程數都小於等待調度對象數目

有了上面幾個概念,就比較好解釋那兩個參數了,這兩個參數分別成爲低水印值和高水印值,它的取值實際上是等待調度對象與線程池中線程數的比值。低水印值的含義是當比值小於這個值後,即等待調度對象少於線程池中線程數且達到某個度時,則需要銷燬一些線程池中的線程數,以減少系統負載。而高水印值的含義則是當比值大於這個值後,在不超出線程池大小的前提下,增加線程池中線程數。所以一般情況下高水印值都是取1。

下面開始深入線程池的內部了,首先線程池是用了一個先進先出隊列來保存等待調度對象,

 

  1. private SizingFifoQueue<Runnable> m_delegateQ; 

用一個簡單的數組來保存線程池,

 

  1. private Fiber[] m_fibers; 
  2. private float m_hiRatio; 
  3. private float m_loRatio; 
  4. private int m_maxSize; 

 上面除了保存線程的數組外,另外三個變量依次表示高水印值,低水印值及線程池大小。

在下一篇文章中將介紹線程池的具體操作流程。

本文出自http://njulinq.blog.51cto.com/1257169/283585


發佈了23 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章