欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

深入理解Apache Mina(5)---- 配置Mina的 線程

系統 1676 0

在Mina的使用中,線程池的配置一個比較關鍵的環節,同時它也是Mina性能提高的一個有效的方法,在Mina的2.0以上版本中已經不再需要對Mina線程池的配置了,本系列文章都是基于當前的穩定版本Mina 1.1.7版來進行講述的,Mina的2.0以上版本現在還都是M(millestone,即里程碑)版的,在1.5版本上2.0M版為穩定版本,但是在1.5+以上則為非穩定版本,所以,為了更好的進行討論和學習,還是基于Mina 1.1.7版本進行討論,如果使用Mina 2.0進行開發要注意JDK的版本問題,當然如果有能力的話也可以自行修改和編譯Mina的2.0版本,這里對此就不再多說,使用2.0版本的同學可以不用理會本文的內容。

?

?

上面的內容都是基于Apache Mina提供的文檔講述,如有需要,請自行查找相關資料,在此不再贅述。

下面開始對Mina的線程模型的配置、使用、及ExcutorFilter的基本原理進行簡單的講解。

配置Mina的三種工作線程


在Mina的NIO模式中有三種I/O工作線程(這三種線程模型只在NIO Socket中有效,在NIO數據包和虛擬管道中沒有,也不需要配置):
Acceptor thread
該線程的作用是接收客戶端的連接,并將客戶端的連接導入到I/O processor線程模型中。所謂的I/O processor線程模型就是Mina的I/O processor thread。Acceptor thread在調用了Acceptor.bind()方法后啟動。每個Acceptor只能創建一個Acceptor thread,該線程模型不能配置,它由Mina自身提供。

Connector thread
該線程模型是客戶端的連接線程模型,它的作用和Acceptor thread類似,它將客戶端與服務器的連接導入到I/O processor線程模型中。同樣地,該線程模型也是由Mina的客戶端自動創建,該線程模型也不能進行配置。

I/O processor thread
該線程模型的主要作用就行接收和發送數據,所有的IO操作在服務器與客戶端的連接建立后,所有的數據的接收和發送都是有該線程模型來負責的,知道客戶端與服務器的連接關閉,該線程模型才停止工作。該線程模型可以由程序員根據需要進行配置。該線程模型默認的線程的數量為cpu的核數+1。若你的cpu為雙核的,則你的I/O processor 線程的最大數量為3,同理若你的若你的cpu為四核的,那么你的I/O processor 線程的最大數量為5。


由上面的內容我們可以知道在Mina中可以配置的線程數量只有I/O processor,對于每個IoService再創建其實例的時候可以配置該IoService的I/O processor的線程數量。在SokcetConnector和SocketAccpetor中I/O Processor的數量是由CPU的核數+1來決定的。

他們的配置方式如下:
?
?

    
      
         /*** * 配置SocketAcceptor監聽器的I/O Processor的線程的數量, * 此處的I/O Processor的線程數量由CPU的核數決定,但Acceptor * 的線程數量只有一個,也就是接收客戶端連接的線程數只有一個, * Acceptor的線程數量不能配置。 * */ SocketAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime() .availableProcessors() + 1, Executors.newCachedThreadPool()); /*** * 配置SocketConnector監聽器的I/O Processor的線程的數量, * 此處的I/O Processor的線程數量由CPU的核數決定,但SocketConnector * 的線程數量只有一個,也就是接收客戶端連接的線程數只有一個, * SocketConnector的線程數量不能配置。 * */ SocketConnector connector = new SocketConnector(Runtime.getRuntime() .availableProcessors() + 1, Executors.newCachedThreadPool()); 
      
    
  

? 在上面的配置比較難以理解的地方就是Runtime.getRuntime().availableProcessors() + 1,它的意思就是由JVM根據系統的情況(即CPU的核數)來決定IO Processor的線程的數量。雖然這個線程的數量是在SocketAcceptor /SocketConnector 的構造器中進行的,但是對于SocketAcceptor /SocketConnector自身的線程沒有影響,SocketAcceptor /SocketConnector的線程數量仍然為1。為SocketAcceptor /SocketConnector本身就封裝了IO Processor,SocketAcceptor /SocketConnector只是由一個單獨的線程來負責接收外部連接/向外部請求建立連接,當連接建立后,SocketAcceptor /SocketConnector會把數據收發的任務轉交I/O Processor的線程。這個在本系列文章的《IoFilter和IoHandler的區別和聯系》中的圖示中可以看。

圖中清晰的顯示了IO Processor就是位于IoService和IoFilter之間,IoService負責和外部建立連接,而IoFilter則負責處理接收到的數據,IoProcessor則負責數據的收發工作。

關于配置IO Processor的線程數量還有一種比較“笨”的辦法,那就一個一個試,你可以根據你的PC的硬件情況從1開始,每次加1,然后得出IO Processor的最佳的線程的數量。但是這種方式個人建議最好不要用了,上面的方法足矣。配置方法如下:

    
      
        //從1--N開始嘗試,N的最大數量為CPU核數+1 SocketAcceptor acceptor = new SocketAcceptor(N, Executors.newCachedThreadPool()); 
      
    
  

?

為Mina的IoFilterChain添加線程池

在Mina的API中提供了一個ExecutorFilter,該線程池實現了IoFilter接口,它可以作為一個IoFilter添加到IoFilterChain中,它的作用就是將I/O Processor中的事件通過其自身封裝的一個線程池來轉發到下一個過濾器中。在沒有添加該線程模型時,I/O Processor的事件是通過方法來觸發的,然后轉發給IoHandler。在沒有添加該線程池的時候,所有的事件都是在單線程模式下運行的,也就是說有的事件和處理(IO Processor,IoHandler,IoFilter)都是運行在同一個線程上,這個線程就是IO Processor的線程,但是這個線程的數量受到CPU核數的影響,因此系統的性能也直接受CPU核數的影響。

比較復雜的應用一般都會用到該線程池,你可以根據你的需求在IoFilterchain中你可以添加任意數量的線程池,這些線程池可以組合成一個事件驅動(SEDA)的處理模型。對于一般的應用來說不是線程的數量越多越好,線程的數量越多可能會加劇CPU切換線程所耗費的時間,反而會影響系統的性能,因此,線程的數量需要根據實際的需要由小到大,逐步添加,知道找到適合你系統的最佳線程的數量。ExcutorFilter的配置過程如下:

    
      
        SocketAcceptor acceptor = ...; DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain(); filterChainBuilder.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()); 
      
    
  

?在配置該線程池的時候需要注意的一個問題是,當你使用自定的ProtocolCodecFactory時候一定要將線程池配置在該過濾器之后,如下所示:

    
      
        DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain(); // 和CPU綁定的操作配置在過濾器的前面 filterChainBuilder.addLast("codec", new ProtocolCodecFactory(...)); // 添加線程池 filterChainBuilder.addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool()); 
      
    
  

?因為你自己實現的ProtocolCodecFactory直接讀取和轉換的是二進制數據,這些數據都是由和CPU綁定的I/O Processor來讀取和發送的,因此為了不影響系統的性能,也應該將數據的編解碼操作綁定到I/O Processor線程中,因為在Java中創建和線程切換都是比較耗資源的,因此建議將ProtocolCodecFactory配置在ExecutorFilter的前面。關于ProtocolCodecFactory詳細講述會在后續的文檔中給出,此處就不多說了。


最后給出一個服務器線程模型完整配置的例子,該例子和KFCClient一起配置使用,詳細代碼在附件中,此處只給出代碼的主要部分:???????

    
      
        SocketAddress address = new InetSocketAddress("localhost", 4321); /*** * 配置SocketAcceptor監聽器的I/O Processor的線程的數量, 此處的I/O * Processor的線程數量由CPU的核數決定,但Acceptor 的線程數量只有一個,也就是接收客戶端連接的線程數只有一個, * Acceptor的線程數量不能配置。 * */ IoAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime() .availableProcessors() + 1, Executors.newCachedThreadPool()); acceptor.getDefaultConfig().setThreadModel(ThreadModel.MANUAL); // 配置數據的編解碼器 acceptor.getDefaultConfig().getFilterChain().addLast("codec", new ProtocolCodecFilter(new ObjectSerializationCodecFactory())); // 此處為你自己實現的編解碼器 // config.getFilterChain().addLast("codec", new // ProtocolCodecFactory(...)); // 為IoFilterChain添加線程池 acceptor.getDefaultConfig().getFilterChain().addLast("threadPool", new ExecutorFilter(Executors.newCachedThreadPool())); acceptor.getDefaultConfig().getFilterChain().addLast("logger", new LoggingFilter()); // 綁定服務器端口 acceptor.bind(address, new KFCFoodPriceHandler()); System.out.println(" 服務器開始在 8000 端口監聽 ......."); // ==========================================// // 此處為客戶端的I/O Processor線程數的配置,你可以模仿 // // IoAcceptor配置來實現 // // ==========================================// /*** * 配置SocketConnector監聽器的I/O Processor的線程的數量, 此處的I/O * Processor的線程數量由CPU的核數決定,但SocketConnector * 的線程數量只有一個,也就是接收客戶端連接的線程數只有一個, SocketConnector的線程數量不能配置。 * */ // SocketConnector connector = new SocketConnector(Runtime.getRuntime() // .availableProcessors() + 1, Executors.newCachedThreadPool()); } 
      
    
    
      
      
    
  

深入理解Apache Mina(5)---- 配置Mina的 線程模型


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 奇米影视777色 | 成年人看的视频网站 | 欧美一级在线观看视频 | www.狠狠艹| 久久一区二区三区精品 | 男女交配视频网站 | 在线视频三级 | 欧美黑人性受xxxx喷水 | 国产精品成人在线观看 | 99国精产品一区二区三区A片 | 欧美一级特黄aaaaaa在线看首页 | 国产高潮久久精品AV无码 | 青青青青娱乐 | 欧美一二三区在线 | 亚洲国产精品99久久久久久久久 | 魔法骑士在线观看免费完整版 | 国产精品久久久久免费 | 久久久9999久久精品小说 | 日韩不卡一区二区 | 欧美成免费 | 日韩精品久久久久久 | 亚洲高清一区二区三区 | 九九操视频 | 麻豆国产精品 | 九九热在线精品视频 | 5g免费影院永久天天影院在线 | 亚洲国产精品网站 | 亚洲精品美女视频 | 亚洲依依成人综合网站 | 日韩特级 | 天天看高清特色大片 | 久久婷婷影院 | 亚洲一区二区三区在线影院 | 色精品一区二区三区 | 欧美久久久久久 | 国产精品人人做人人爽 | 国产成人18黄禁网站免费观看 | 荷兰欧美一级毛片 | 狠狠操麻豆 | 日韩经典中文字幕 | 欧美黄 片免费观看 |