銀行有四個視窗辦業務,好比四個cpu。
如果只開乙個執行緒的話,相當於所有辦業務的人都排成一隊在乙個視窗辦業務,
或者說每個人都必須等上乙個人辦完業務之後隨機選乙個視窗,總之就是序列乙個個來。
所以這體現了多執行緒優點的就是可以充分利用現在計算機配置多核cpu的硬體特性,
把多核cpu利用起來提高任務的處理效率。
在排隊的過程中,如果來了位銀行的vip客戶則這位客戶是不用排隊,直接就可以插隊優先到視窗辦理業務。多執行緒也是這樣,優先高的執行緒不管你是不是先到厚道,老子優先順序高,cpu趕緊給我處理任務。
多執行緒間通訊這個問題,
每個執行緒都操作同乙個變數,這個變數就叫做共享變數。
通過訪問和修改這個變數的值來獲取對方的資訊,和通知對方我做了什麼,這樣就可以讓相互不認識的多個執行緒盡然有序的做一項事情。
第一種是 cpu 密集型任務,比如加密、解密、壓縮、計算等一系列需要大量耗費 cpu 資源的任務。
最佳執行緒數 = cpu 核心數的 1~2 倍
如果設定過多的執行緒,實際上並不會起到很好的效果。此時假設我們設定的執行緒數是 cpu 核心數的 2 倍以上,因為計算機的任務很重,會占用大量的 cpu 資源,所以這是 cpu 每個核心都是滿負荷工作,而設定過多的執行緒數,每個執行緒都去搶占 cpu 資源,就會產生不必要的上下文切換,反而會造成整體效能的下降。
第二種任務是耗時 io 型,比如資料庫、檔案的讀寫,網路通訊等任務,這種任務的特點是並不會特別消耗 cpu 資源,但是 io 操作很耗時,總體會占用比較多的時間。
對於這種情況任務最大執行緒數一般會大於 cpu 核心數很多倍,因為 io 讀寫速度相比於 cpu 的速度而言是比較慢的,如果我們設定過少的執行緒數,可能導致 cpu 資源的浪費。而如果我們設定更多的執行緒數,那麼當一部分執行緒正在等待 io 的時候,它們此時並不需要 cpu 來計算,那麼另外的執行緒便可以利用 cpu 去執行其他的任務,互不影響,這樣的話在任務佇列中等待的任務就會減少,可以更好地利用資源。
執行緒數 = cpu 核心數 * (1+ io 耗時/cpu 耗時)
通過這個公式,我們可以計算出乙個合理的執行緒數量,如果任務的 io 耗時時間長,執行緒數就隨之增加,而如果cpu 耗時長,也就是對於我們上面的 cpu 密集型任務,執行緒數就隨之減少。
太少的執行緒數會使得程式整體效能降低,而過多的執行緒也會消耗記憶體等其他資源,所以如果想要更準確的話,可以進行壓測,監控 jvm 的執行緒情況以及 cpu 的負載情況,根據實際情況衡量應該建立的執行緒數,合理並充分利用資源。
綜上所述我們就可以得出以下結論:
執行緒的 cpu 耗時所佔比例越高,就需要越少的執行緒
執行緒的 io 耗時所佔比例越高,就需要越多的執行緒
針對不同的程式,進行對應的實際測試就可以得到最合適的選擇
執行緒數 >= cpu 核心數
C 多執行緒 非同步執行緒 執行緒池相關知識
執行緒池threadpool類會在需要時增減池中線程的執行緒數,直到最大的執行緒數。池中的最大執行緒數是可配置的。在雙核cpu中,預設設定為1023個工作執行緒和1000個i o執行緒。也可以指定在建立執行緒池時應立即啟動的最小執行緒數,以及執行緒池,中可用的最大執行緒數。如果有更多的作業要處理,執...
多執行緒 執行緒池
第一 降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷毀造成的消耗。第二 提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。第三 提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一分配 調優和監控...
多執行緒 執行緒池
執行緒池是什麼 執行緒池 thread pool 是一種基於池化思想管理執行緒的工具,經常出現在多執行緒伺服器中,如mysql。執行緒過多會帶來額外的開銷,其中包括建立銷毀執行緒的開銷 排程執行緒的開銷等等,同時也降低了計算機的整體效能。執行緒池維護多個執行緒,等待監督管理者分配可併發執行的任務。這...