線程池的組成及種類


我們知道一個進程可以把任務分成多個部分交給線程執行,多線程技術減少了CPU閒置時間,增加了程序併發性。
假設創建線程的時間爲t1,執行任務的時間爲t2,銷燬線程的時間爲t3。如果(t1+t2)>t3那麼線程的創建和銷燬就消耗了太多的資源,因此引進了線程池的概念。

一、 線程池的組成結構

一個線程池包括四個基本部分
1.線程管理池(ThreadPool):用於創建並管理線程池,有創建,銷燬,添加新任務;
2.工作線程(PoolWorker):線程池中的線程在沒有任務的時候處於等待狀態,可以循
環的執行任務;
3.任務接口(Task):每個任務必須實現接口,用來提供工作線程調度任務的執行,規定了任務的入口以及執行結束的收尾工作和任務的執行狀態等;
4.任務隊列:用於存放沒有處理的任務,提供一種緩存機制。

二、常見的線程池種類

1.CachedThreadPool(可緩存的線程池)
2.SecudleThreadPool(週期性執行任務的線程池)
3.SingleThreadPool(單線程線程池)
4.FixedThreadPool(定常的線程池)

在這裏插入圖片描述

三、線程池的工作流程

在這裏插入圖片描述
拿存在覈心線程的線程池爲例,這樣其他線程池也很容易瞭解了!
在這裏插入圖片描述
在這裏我們要注意:核心線程池滿了之後是判斷任務隊列是否滿,而不是創建非核心線程,在線程池中只有核心線程是永久存在的,其他線程都有自己的生命週期,時間一到線程就會被銷燬。
當創建的線程數超過了最大容量,那麼操作系統就會調用handle處理機制:
1.AbortPolicy:不執行新任務,直接拋出異常
2.DisCardPolicy:不執行新任務,也不拋異常
3.DisCard OldSetPolicy,新任務替換任務隊列的第一個任務
4.CallerRunsPolicy:直接調用execute執行當前任務。

四、線程池的好處

線程池可以限制系統中執行線程的數量。 針對一些需要處理的短小而數量巨多的線程
根據系統的環境情況,可以自動或手動設置線程數量,達到運行的最佳效果;少了浪費了系統資源,多了造成系統擁擠效率不高。

五、小結

Java中的線程池的頂級接口是Executor,我們真正使用的是ExecutorService,他的默認實現是ThreadPoolExecutor;
創建線程池的方式:

ExecutorService pool = Executors.newCachedThreadPool();

什麼是Executor框架?
Executor 框架是一個根據一組執行策略調用、調度、執行和控制的異步任務的框架。利用它可以方便地創建線程池。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章