java面試 多執行緒

2021-08-20 03:20:49 字數 1766 閱讀 4400

面試總結-多執行緒

1 執行緒狀態

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

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

2 執行緒池

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

執行緒池的一些核心引數:coresize, maxsize,overtime,queue的大小,rejecthandler

coresize:核心執行緒數

maxsize:最大執行緒數

overtime:超時時間

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

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

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

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

jdk一些常用的執行緒池

(1) 快取型池子,先檢視池中有沒有以前建立的執行緒。如果有,就reuse,如果沒有,就建立乙個新的執行緒加入池中;

(2) 快取型池子,通常用於執行一些生存週期很短的非同步型任務;因此一些面向連線的daemon型server中用得不多;

(3) 能reuse的執行緒,必須是timeout idle內的池中線程,預設timeout是60s,超過這個idle時長,執行緒例項將被終止及移出池。

(4) 注意,放入cachedthreadpool的執行緒不必擔心其結束,

超過timeout不活動,其會自動被終止

(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。

(1) 排程型執行緒池

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

(1) 單例執行緒,任意時間池中只能有乙個執行緒

(2) 用的是和cache池和fixed池相同的底層池,但執行緒數目是1-1,0秒idle(無idle)

以上執行緒池,如果想更新如的了解,可以檢視jdk原始碼threadpoolexecutor

java多執行緒面試題

有三個執行緒id分別是a b c,請有多線程式設計實現,在螢幕上迴圈列印10次abcabc 由於執行緒執行的不確定性,要保證這樣有序的輸出,必須控制好多執行緒的同步。執行緒同步有兩種基本方法 1 synchronized 2 wait,notify,notifyall 現在分別採用這兩種方法來解答這...

Java多執行緒面試題

執行緒池的原理,為什麼要建立執行緒池?將預先建立好的執行緒放入執行緒池當中。當有執行緒請求時,則從執行緒池中呼叫執行緒,呼叫結束之後歸還執行緒。當出現需要建立大量執行緒的情況時,反覆的建立執行緒會造成大量的效能損耗。使用執行緒池能降低損耗,提高響應的速度,方便管理執行緒。執行緒的生命週期,什麼時候會...

java多執行緒面試題1

假設如下 中,若t1執行緒在t2執行緒啟動之前已經完成啟動。的輸出是 public static void main stringargs throws exception catch interruptedexception e t1.start thread.sleep 1000 we assu...