執行緒相關內容總結

2021-10-12 16:18:57 字數 3302 閱讀 1473

1)corepoolsize

代表核心執行緒數。每當新的任務提交過來的時候,執行緒池就會建立乙個核心執行緒來執行這個任務,即使已經有其他的核心執行緒處於空閒狀態

而當需要執行的任務數大於核心執行緒數時,將不再建立新的核心執行緒。

2)maximumpoolsize

代表執行緒所允許的最大數量。即,當阻塞佇列已滿的時候,並且已經建立的執行緒數小於最大執行緒數,則會建立新的執行緒去執行任務。

3)keepalivetime

代表執行緒空閒後,保持存活的時間,當allowcorethreadtimeout = true時,超過一定的時間沒有任務執行,執行緒就會自動銷毀。

4)unit

代表描述存活時間的時間單位。

5)workqueue

代表阻塞佇列,儲存所有等待執行的任務。

6)threadfactory

代表用來建立執行緒的工廠。可以自定義乙個工廠,傳參進來。如果不指定的話,就會使用預設工廠(executors類裡邊的 defaultthreadfactory)。

7)handler

代表拒絕策略,當阻塞佇列和執行緒池都達到了最大執行緒數,使用的處理策略。

一共有四種策略可供選擇,分別對應四個內部類:

執行緒池中會維護乙個最小的執行緒數量,即使處於空閒狀態,並且空閒時間超過了keepalivetime,執行緒也不會被銷毀,而是處於阻塞狀態,等待任務佇列的任務來執行

當乙個任務被提交,首先會判斷是否存在空閒的執行緒(注:如果執行緒池裡還沒有執行緒,或者執行緒池裡存活的執行緒數小於核心執行緒數則會直接建立新執行緒)

如果執行緒池中存在空閒執行緒,則會直接執行提交的任務,如果執行緒池中沒有空閒的執行緒,任務將會被快取到任務佇列中等待被執行

當任務佇列超過佇列的最大容量時,執行緒池會建立乙個新執行緒,然後從任務佇列的頭部取出乙個任務交由新執行緒來處理,而將剛提交的任務放入工作佇列尾部

執行緒池建立新執行緒的限制,是由最大執行緒數減去核心執行緒數來確定

當前執行緒池中執行的執行緒數超過最大執行緒數量,會根據拒絕策略來拒絕該任務

1) arrayblockingqueue

構造方法中,第乙個引數指定佇列的大小,第二個引數指定佇列是否公平(預設非公平)

使用 reentrantlock 的公平鎖和非公平鎖實現

簡單理解就是,reentrantlock 內部會維護乙個有先後順序的等待佇列,當多個任務同時進入時會都被阻塞

如果是公平的,則等待佇列中等待最久的任務就會先進入阻塞佇列。如果是非公平的,那麼這些執行緒就需要搶鎖,誰先搶到,誰就先進入阻塞佇列

arrayblockingqueue 由於讀寫用的是同一把鎖,沒有實現讀寫分離,也就是說,讀和寫是不能同時進行的

存在不指定容量的構造方法,預設值是 integer.max_value

建議指定乙個固定大小,如果生產者的速度比消費者的速度大的多的情況下,這會導致阻塞佇列一直膨脹,直到系統記憶體被耗盡

linkedblockingqueue 實現了讀寫分離,可以實現資料的讀和寫互不影響,這在高併發的場景下,效率較arrayblockingqueue提公升巨大

構造方法

佇列是沒有大小的,插入操作的完成必須等待另乙個執行緒完成相應的刪除操作

當有執行緒想刪除元素的時候,你才能新增成功,不會內部自己儲存元素

excutors.newcachedthreadpool 方法用的就是這種佇列

構造方法中,可以指定初始容量大小(預設大小為 11),可以傳入比較器,把元素按一定的規則排序(預設自然順序)

priorityblockingqueue 是基於二叉樹最小堆實現的,每當取元素的時候,就會把優先順序最高的元素取出來

帶有延遲時間的無界阻塞佇列,佇列中的元素只有到達延時時間,才能取出,未過期的元素不能夠被 take

不允許空元素

此佇列一般用於過期資料的刪除,或任務排程

corepoolsize:核心執行緒數

maxpoolsize:最大執行緒數,

keepaliveseconds:執行緒最大空閒時間

queuecapacity:佇列大小

rejectedexecutionhandler:拒絕策略

allowcorethreadtimeout:執行緒存活時間是否生效

public executor myexecutor()
1)初始狀態

實現runnable介面和繼承thread可以得到乙個執行緒類,new乙個例項出來,執行緒就進入了初始狀態

2)就緒狀態

有資格執行的執行緒,未被排程程式挑選時仍處於就緒狀態

呼叫執行緒的start()方法,此執行緒進入就緒狀態

當前執行緒sleep()方法結束,其他執行緒join()結束,等待使用者輸入完畢,某個執行緒拿到物件鎖,這些執行緒也將進入就緒狀態

當前執行緒時間片用完了,呼叫當前執行緒的yield()方法,當前執行緒進入就緒狀態

鎖池裡的執行緒拿到物件鎖後,進入就緒狀態

3)執行中狀態

執行緒排程程式從可執行池中選擇乙個執行緒作為當前執行緒時執行緒所處的狀態。這也是執行緒進入執行狀態的唯一一種方式

4)阻塞狀態

阻塞狀態是執行緒因為某種原因放棄cpu使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。阻塞的情況分三種:

5)終止狀態

執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。

檢測相關內容總結

設取樣點為 y n,n 1,n 這些取樣點由目標訊號 m ae 和i q兩路功率均為 sigma 2 2 的高斯白雜訊 omega n 組成,對應假設 h 0 和 h 1 下 y n 的組成分別為 h 0 y n omega n h 1 y n m omega n 設 z n y n 則對應假設 h...

oracle 許可權相關內容總結

1.系統許可權管理 1.1 3個預設使用者 oracle 9i sys change on install as sysdba sqlplus as sysdba system manager scott triger oracle 10g以上 sys 安裝的時候設定.as sysdba syste...

網路請求相關內容總結

網路資料傳輸,熟悉多執行緒 socket網路程式設計 熟悉tcp udp http等協議 tcp ip模型 埠號 傳輸協議 資料要傳送到指定埠。為了標示不同的應用程式,所以給這些網路應用程式都用數字進行標示這個表示就叫埠 定義通訊規則。這個規則稱為通訊協議,國際組織定義了通用協議tcp ip tcp...