Java中線程池的理解

Java中線程池的理解

凱哥java 凱哥java
Java中線程池的理解

通過前面講解,我們知道了Java中三種獲取多線程的方法了。但是,在實際企業中,經常使用到的是第四種—使用線程池獲取線程。在講解這種獲取方式之前,我們先來聊聊線程池是什麼?爲什麼要使用線程池,也就是線程池有哪些特點。通過本文學習之後,你會對線程池有所理解。然後我們再來看看跟着凱哥(凱哥Java:kaigejava)一起學線程池這個系列教程將會有什麼收穫。

一:生活中池化案例

我們先來看看我們熟悉的幾種池子。游泳池(存放水的池子)、數據庫連接池(存放數據庫連接的池子)。

生活中的游泳池大家很熟悉吧。夏天到了,去遊個泳很爽吧。我們來看看游泳池

Java中線程池的理解
游泳池的工作:存放水資源的池子,供大家使用。

好處:

1:一個游泳池可用供應多個人來遊玩,這樣就降低了資源的消耗。回想下你自己洗澡的時候,是不是水直接就從下水道流走了,如果在游泳池的話,就會重複利用(額,這個舉例有點……,大家明白是爲了降低資源消耗就可用);

2:游泳池可用在沒有開門之前就先向游泳池中注入水,zheya那個等開門後,有人來遊玩的話,就可以直接玩了。不用再等待,這樣就提高了響應的速度了。

同樣,數據庫連接池同樣。

通過上面我們可用知道線程池具有同樣的功能了。那麼我們來看看線程池.

二:線程池

線程池做的工作主要是控制運行的線程的數量,處理過程中將任務放到隊列中,然後在線程創建後啓動這些任務,如果線程數量超過了最大數量,超出數量的線程排隊等候,等待其他線程執行完畢,再從隊列中取出任務來執行。

三:使用線程池的優點

線程池主要特點:

線程複用;控制最大併發數;管理線程。

第一:降低資源消耗。通過重複利用已經創建的線程降低線程創建和銷燬造成的消耗。

我們知道當使用new關鍵字創建對象的時候,JVM需要向系統申請資源,當對象運行完成之後,又需要CG垃圾回收器進行回收的。這個創建和銷燬也是需要消耗資源的。

第二:提高響應速度。當任務到達時候,任務可以不需要再等到線程創建就能立即執行。

在系統啓動的時候,我們預先初始化一定數量的線程放到線程池中,這樣,如果有需要用的線程的地方,就可以直接調用了,不用再等待了(可用理解爲游泳池館在開門之前,就已經把水注入到池子中了,這樣,開門後,有人過來,不用再等待)。.

第三:提高線程的可管理性。線程是稀缺的資源,如果無限制的創建,不僅會消耗系統資源,還會降低系統的穩定性,使用線程池可以進行統一的分配,調優和監控。

這裏需要說明一點,如果線程過多,併發量過大,會造成CPU的過度切換從而影響到系統的性能。

CPU上下文切換:
Java中線程池的理解

所謂的CPU上下文切換就是,CPU在執行的時候,不是執行一個任務一條道走到底的,CPU在執行的時候,並非把一個任務執行完成才執行另外一個的而是切換着來的。比如A任務需要在CPU中執行10個步驟。在CPU實際執行的時候,先執行A任務的第一個步驟,執行完A1之後,會把A任務掛起,切換到B任務中,執行B2,當B2執行完成後,有可能會執行C5或者是A2的。這種上下文切換也會消耗資源和時間的。如果線程的併發量控制不好的話,就會導致CPU頻繁的進行上下文切換,這樣是很影響性能的,而且會導致CPU負載過高的。通過線程池的話,我們就可以有效的控制線程的併發數量,從而對我們開發的系統進行調優處理。

本文是凱哥(凱哥Java:kaigejava)講解線程池的第一篇:線程池的理解。我們來看看線程池這個系列教程,會學到哪些東西,請看下圖:

Java中線程池的理解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章