1. 程式人生 > >java面試-多執行緒

java面試-多執行緒

面試總結-多執行緒

1 執行緒狀態

先簡單的看一下執行緒之間的狀態扭轉圖

從上面的圖中可以看出執行緒大概有就緒,執行,阻塞,死亡這幾個狀態,各個狀態之間的扭轉在圖中描寫挺清晰

2 執行緒池

面試過程中,經常會被問到執行緒池

執行緒池的一些核心引數:coreSize, maxSize,overtime,queue的大小,rejectHandler

coreSize:核心執行緒數

maxSize:最大執行緒數

overtime:超時時間

queue:用來存放待處理的任務

rejectHandler:用來處理執行緒佇列和最大執行緒數都滿的情況採用的處理策略,目前有四種策略可供選擇,任務直接丟棄,任務直接丟棄並丟擲異常,在當前執行緒中執行,中佇列的開始出選擇一個丟棄並把新任務加入進來

整個執行緒池的執行流程如下:


整個執行緒池的狀態(注意上述是執行緒狀態,這裡是執行緒池狀態)


JDK一些常用的執行緒池

1 newCachedThreadPool

(1) 快取型池子,先檢視池中有沒有以前建立的執行緒。如果有,就reuse,如果沒有,就建立一個新的執行緒加入池中;
(2) 快取型池子,通常用於執行一些生存週期很短的非同步型任務;因此一些面向連線的daemon型server中用得不多;
(3) 能reuse的執行緒,必須是timeout IDLE內的池中執行緒,預設timeout是60s,超過這個IDLE時長,執行緒例項將被終止及移出池。
(4) 注意,放入CachedThreadPool的執行緒不必擔心其結束,
超過TIMEOUT不活動,其會自動被終止

二:newFixedThreadPool

(1) newFixedThreadPool與cacheThreadPool差不多,也是能reuse就用,但不能隨時建新的執行緒。
(2) 其獨特之處:任意時間點,最多隻能有固定數目的活動執行緒存在,此時如果有新的執行緒要建立,只能放在另外的佇列中等待,直到當前的執行緒中某個執行緒終止直接被移出池子。
(3) 和cacheThreadPool不同,FixedThreadPool沒有IDLE機制(可能也有,但既然文件沒提,肯定非常長,類似依賴上層的TCP或UDP IDLE機制之類的),所以FixedThreadPool多數針對一些很穩定很固定的正規併發執行緒,多用於伺服器。
(4) 從方法的原始碼看,cache池和fixed 池呼叫的是同一個底層池,只不過引數不同:
--fixed池執行緒數固定,並且是0秒IDLE(無IDLE);
--cache池執行緒數支援0-Integer.MAX_VALUE(顯然完全沒考慮主機的資源承受能力),60秒IDLE。

三:ScheduledThreadPool

(1) 排程型執行緒池
(2) 這個池子裡的執行緒可以按schedule依次delay執行,或週期執行

四:SingleThreadExecutor

(1) 單例執行緒,任意時間池中只能有一個執行緒
(2) 用的是和cache池和fixed池相同的底層池,但執行緒數目是1-1,0秒IDLE(無IDLE)