1. 程式人生 > >輕鬆學會多執行緒(三)——如何確定執行緒數

輕鬆學會多執行緒(三)——如何確定執行緒數

一般情況下,在網際網路程式設計中,我們會使用多執行緒來搶奪網路資源。那麼,執行緒數量我們如何來確定呢?

我們都知道,執行緒數量和CPU核數有關。所以有人建議說:執行緒數為核數的兩倍最好。

其實只要這些執行緒不頻繁切換、競爭資源的話。想要最優效能,還是根據具體專案慢慢除錯。

CPU切不切換我們沒法控制,只能提高執行緒優先順序以獲取更多的CPU時間。

CPU除了處理Java還需要處理N多系統和其他執行緒,一般而言,多執行緒程式設計中,在確保記憶體不溢位的情況下提升執行緒數是可以提高CPU中籤率的,也就是能提高你的程式處理資料的速度。

不過,即使沒有溢位,也不是執行緒數越大越好,執行緒切換畢竟需要時間,應該找到瓶頸所在。例如如果大部分執行緒都在等待同步模組的執行,那麼瓶頸就是同步模組,這時候應該減少執行緒數或者優化同步模組。除錯方式可以用打時間的方式,觀察執行緒在哪個地方執行時間最長,然後找到原因,同時能判斷執行緒數是大了還是小了。

1.確定最佳執行緒數量

首先確定應用是CPU密集型 (例如分詞,加密等),還是耗時io( 網路,檔案操作等)

CPU密集型:最佳執行緒數等於cpu核心數或稍微小於cpu核心數。。。具體數值要以jvm圖形執行緒監控顯示繁忙情況為依據。。

耗時io型:最佳執行緒數一般會大於cpu核心數很多倍。。一般是io裝置延時除以cpu處理延時,得到一個倍數,我的經驗數值是20--50倍*cpu核心數,,具體數值也是要以jvm圖形執行緒監控顯示繁忙情況為依據。。保證執行緒空閒可以銜接上。。。

最佳執行緒數量也與機器配置(記憶體,磁碟速度)有關,如果cpu,記憶體,磁碟任何一個達到頂點,就需要適當減少執行緒數。。

2.使用多執行緒的原因

a.防止介面卡死.

提高使用者的使用者體驗

對單核CPU,對客戶端軟體,採用多執行緒,主要是 建立多執行緒將一些計算放在後臺執行,而不影響使用者互動操作。(使用者介面 & 其他計算 並行進行)提高使用者的操作效能!

b.耗時的操作(io,網路io等)使用執行緒,提高cpu使用率..

I/O操作不僅包括了直接的檔案、網路的讀寫,還包括資料庫操作、Web Service、HttpRequest以及.net Remoting等跨程序的呼叫。

要是不使用多執行緒,你回發現cpu使用率很空閒..

c.多CPU(核心)中,使用執行緒提高CPU利用率

使多CPU系統更加有效

作業系統會保證當執行緒數不大於CPU數目時,不同的執行緒運行於不同的CPU上。

要是不使用多執行緒,你回發現僅僅一個cpu很忙碌的,其他cpu使用率很空閒..

3.不適用多執行緒的情況

a.你的程式碼是cpu密集型,在單核cpu上..

b.單核cpu上,執行緒的使用(濫用)會給系統帶來上下文切換的額外負擔。並且執行緒間的共享變數可能造成死鎖的出現。

c.當需要執行I/O操作時,使用非同步操作常常比使用執行緒+同步I/O操作更合適。

對於耗時io型,一個簡單的演算法::最佳執行緒數==單個執行緒的黃色時間塊長度(空閒) / 綠色時間塊長度(繁忙) * cpu核心數

執行緒圖形化監控工具:: 可以用jprofile  ,,,磁碟佇列圖形化監控工具:::工作管理員》》資源監視器》》磁碟佇列深度

JAVA語言多執行緒的實現方式有兩種,一種是寫繼承Thread類的方式,一種是實現Runnable介面的方式。使用java語言程式設計開啟幾個執行緒可以由你自己來定義,另外主方法main是JAVA語言應用程式的入口,JVM會找到這個東西,他也是一個執行緒,還要附加上JVM中負責垃圾回收的執行緒,所以執行一個java程式,首先就已經是多執行緒的了,main和GC,另外定義幾個執行緒,同時執行,就看你了。CPU原來一直是單核的,後來出了雙核,現在有了四核,甚至是更多。在單核系統中,雖然實現了多執行緒,但是實際上還是單執行緒執行,CPU以極短的時間,在各個執行緒之間做切換,從最微觀的角度來看還是單執行緒的執行。後來出現了雙核系統,貌似是實現了多執行緒的實際並行,但是具體原理我沒有再瞭解過。總之CPU多了一個核,程式執行速度快了很多。

執行緒消縱即逝,用工具不容易監控,用日誌反而方便,jMeter只能監控當前資源佔用而已,常規工具對消逝的執行緒是沒有記錄的。合適的執行緒數,需要基於一定的標準,不斷除錯得出。

(未整理)