執行緒池 多執行緒學習筆記(三)

2021-09-02 12:23:20 字數 1550 閱讀 8205

執行緒池產生原因:

建立很多執行緒造成的兩個問題:

1.構建乙個新的執行緒會涉及到與作業系統的互動,會消耗一定的系統資源,當使用完這些新建立的執行緒後,執行緒就會被銷毀,然後當我們再建立的時候就會再次消耗系統資源,所以如果建立很多生命期很短的執行緒,就會消耗很大的系統資源,甚至給系統帶來很大的壓力。

2.現在不考慮重複建立很多執行緒造成的壓力,單單從建立大量的執行緒併發執行任務這一點考慮,我們的系統能承受的執行緒數量是有限的,建立大量的執行緒會大大降低效能甚至是虛擬機器崩潰。

所以這裡為了解決建立多個執行緒造成的這兩個問題是執行緒池的出生的意義。

執行緒池的作用:

執行緒池的介面:executorservice

executor類提供了四種執行緒池(這四種方法都是靜態方法):

(1)newcachedthreadpool():(帶快取的執行緒池)

必要時建立新執行緒;空閒執行緒會被保留60s

(2) newfixedthreadpool():(固定數量執行緒的執行緒池)

該執行緒池中的執行緒數量有引數決定

(3)newsinglethreadexecutor():(單個執行緒的執行緒池)

它在乙個單個的執行緒中依次執行各個任務

(4)newscheduledthreadpool():(可控制延遲時間或者週期執行執行緒的執行緒池)

具體四個執行緒池的介紹:

newcachedthreadpool():該方法構建了乙個執行緒池,對於每個任務,如果有空閒執行緒可用,立即讓它執行任務,如果沒有可用的空閒執行緒,則建立乙個新執行緒。也就是說,當執行緒池中的執行緒比較多,超出了我們任務所需的執行緒數量,許多執行緒就會空閒下來,這個執行緒池就會把空閒的執行緒**,當任務增多了,執行緒池就會智慧型的從執行緒池中把執行緒拿出來使用。(執行緒池的大小不固定,跟系統能支援的執行緒數量有關)。

newfixedthreadpool(int i):該方法構建乙個具有固定大小的執行緒池,如果提交的任務數多於空閒的執行緒數,那麼把得不到服務的任務放置到佇列中。當其他任務完成之後在執行它們。

newsinglethreadexecutor():是乙個退化了的大小為1的執行緒池:有乙個執行緒執行提交的任務,乙個接乙個,相當於排隊執行任務,先來先執行。

newscheduledthreadpool():週期性的,定時的執行某些任務,該執行緒池中的執行緒的數量沒有固定,相當於無限大。

執行緒池的使用方法:

只需要將待執行的任務放到run()方法中即可,將runnable介面的實現類交給執行緒池的execute方法,作為它的乙個引數。

executor executor = executors.newfixedthreadpool(6);

executor.execute(new runnable()

}

當用完乙個執行緒池的時候,呼叫shutdown()方法,該方法啟動該池的關閉序列,會先完成已經提交的任務而不再接收新的任務。(也可以呼叫shutdownnow()方法,那麼取消該執行緒池中的尚未開始的所有任務並試圖中斷正在執行的執行緒)

多執行緒程式設計學習筆記 執行緒池(三)

接上文多執行緒程式設計學習筆記 執行緒池 一 接上文 多執行緒程式設計學習筆記 執行緒池 二 執行緒池還有乙個threadpool.registerwaitforsingleobject,這個方法允許我們將 函式放入執行緒池中的佇列中。當提供的等待事件處理器接收到訊號或發生超時時,這個 函式將被呼叫...

多執行緒學習筆記7之執行緒池

executors 建立執行緒池的類,提供四種執行緒池 public class callabledemo callable callable是乙個任務,類似於runnable,但是callable任務是有返回值的,一般用執行緒池去執行這個callable任務,返回乙個包含callable執行結果的...

多執行緒程式設計學習筆記 執行緒池(一)

接上文 多執行緒程式設計學習筆記 執行緒同步 一 接上文 多執行緒程式設計學習筆記 執行緒同步 二 接上文 多執行緒程式設計學習筆記 執行緒同步 三 建立多執行緒操作是非常昂貴的,所以每個執行時間非常短的操作,建立多執行緒進行操作,可能並不能提高效率,反而降低了效率。執行緒池,就是我們先分配一些資源...