您現在的位置是:首頁 > 綜合

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

  • 由 老徐聊java 發表于 綜合
  • 2022-06-20
簡介3) CachedThreadPoolCachedThreadPool一看到Cache就知道這是一個和快取有關的執行緒池,每次有任務提交到執行緒池的時候,如果池中沒有空閒的執行緒,執行緒池就會為這個任務建立一個執行緒,如果有空閒的執行緒,就

為什麼要用執行緒池

我還記得大學實習面試時,被問到什麼是執行緒池這個問題,因為這個題我被錄取了,原因就是我背出來了,而另外一個面試的沒背出來,說實話當時還真不知道它是幹什麼的,就是看面試題給背下來了,在之後就是在實際開發中,確實使用到了。

首先說什麼是執行緒池,為什麼使用執行緒池?執行緒池就是提前建立若干個執行緒,如果有任務需要處理,執行緒池裡的執行緒就會處理任務,處理完之後執行緒並不會被銷燬,而是等待下一個任務。由於建立和銷燬執行緒都是消耗系統資源的,所以當你想要頻繁的建立和銷燬執行緒的時候就可以考慮使用執行緒池來提升系統的效能。

Java中有三個比較常用的執行緒池,分別是FixedThreadPool,SingleThreadExecutor,CachedThreadPool。

1)FixedThreadPool

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

FixedThreadPool

這是一個執行緒數固定的執行緒池,當這個執行緒池被建立的時候,池裡的執行緒數就已經固定了。當需要執行的執行緒數量大體上變化不大時,適合使用這種執行緒池。固定數量還有一個好處,它可以一次性支付高昂的建立執行緒的開銷,之後再使用的時候就不再需要這種開銷。

2) SingleThreadExecutor

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

SingleThreadExecutor

這是一個執行緒數量為1的執行緒池,所有提交的這個執行緒池的任務都會按照提交的先後順序排隊執行。單個執行緒執行有個好處:由於任務之間沒有併發執行,因此提交到執行緒池種的任務之間不會相互干擾。程式執行的結果更具有確定性。

3) CachedThreadPool

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

CachedThreadPool

一看到Cache就知道這是一個和快取有關的執行緒池,每次有任務提交到執行緒池的時候,如果池中沒有空閒的執行緒,執行緒池就會為這個任務建立一個執行緒,如果有空閒的執行緒,就會使用已有的空閒執行緒執行任務。有的人可能會有個疑惑:這樣執行緒不就越來越多了嗎?其實不是的,這個執行緒池還有一個銷燬機制,如果一個執行緒60秒之內沒有被使用過,這個執行緒就會被銷燬,這樣就節省了很多資源。

上面這3中在一般的小專案使用可以了,但是無限制的建立執行緒可能造成記憶體溢位,因為上面的佇列都是無界限的,沒有設定大小。還有拒絕策略可能你不想使用預設的(AbortPolicy)。拒絕策略如圖:

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

拒絕策略

為什麼說AbortPolicy是預設的,看下原始碼

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

ThreadPoolExecutor

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

比如小編的專案中,就自定義一個執行緒池。定義佇列裡的個數不能超過5個,策略還是使用預設策略,從上面的3中建立方式中,可以看得出他們都是透過ThreadPoolExecutor來建立的,所以我也是透過ThreadPoolExecutor來建立。

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

自定義

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

執行

面試官問你java都有哪些執行緒池,自己是否自定義過執行緒池

結果

這樣都佇列滿時,就會丟擲異常。

總結:

1、執行緒池是一個典型的“用空間換時間”的應用案例,線上程池中始終維護一定數量的執行緒,這樣不必每次都建立新的執行緒,代價是執行緒即使空閒的時候也要佔用記憶體資源。當需要頻繁建立和銷燬執行緒的時候,使用執行緒池可以顯著提高系統的執行效率。

2、自定義執行緒可以滿足我們控制佇列,避免造成記憶體溢位,也能滿足我們設定對佇列滿時的拒絕策略。

Top