JUC--線程池實現

什麼是線程池

Java中的線程池是運用場景最多的併發框架,幾乎所有需要異步或併發執行任務的程序
都可以使用線程池。在開發過程中,合理地使用線程池能夠帶來3個好處。
第一:降低資源消耗。通過重複利用已創建的線程降低線程創建和銷燬造成的消耗。
第二:提高 響應速度。當任務到達時,任務可以不需要等到線程創建就能立即執行。
第三:提高線程的可管理性。線程是稀缺資源,如果無限制地創建,不僅會消耗系統資源,
還會降低系統的穩定性,使用線程池可以進行統一分配、調優和監控。但是,要做到合理利用
線程池,必須對其實現原理瞭如指掌。

線程池作用

線程池是爲突然大量爆發的線程設計的,通過有限的幾個固定線程爲大量的操作服務,減少了創建和銷燬線程所需的時間,從而提高效率。
如果一個線程的時間非常長,就沒必要用線程池了(不是不能作長時間操作,而是不宜。),況且我們還不能控制線程池中線程的開始、掛起、和中止。

線程池的分類

ThreadPoolExecutor
Java是天生就支持併發的語言,支持併發意味着多線程,線程的頻繁創建在高併發及大數據量是非常消耗資源的,因爲java提供了線程池。在jdk1.5以前的版本中,線程池的使用是及其簡陋的,但是在JDK1.5後,有了很大的改善。JDK1.5之後加入了java.util.concurrent包,java.util.concurrent包的加入給予開發人員開發併發程序以及解決併發問題很大的幫助。
Executor框架的最頂層實現是ThreadPoolExecutor類,Executors工廠類中提供的newScheduledThreadPool、newFixedThreadPool、newCachedThreadPool方法其實也只是ThreadPoolExecutor的構造函數參數不同而已。通過傳入不同的參數,就可以構造出適用於不同應用場景下的線程池,那麼它的底層原理是怎樣實現的呢,這篇就來介紹下ThreadPoolExecutor線程池的運行過程。

線程池四種創建方式
Java通過Executors(jdk1.5併發包)提供四種線程池,分別爲:

newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閒線程,若無可回收,則新建線程。
newFixedThreadPool 創建一個定長線程池,可控制線程最大併發數,超出的線程會在隊列中等待。
newScheduledThreadPool 創建一個定長線程池,支持定時及週期性任務執行。

newSingleThreadExecutor 創建一個單線程化的線程池,它只會用唯一的工作線程來執行任務,保證所有任務按照指定順序(FIFO, LIFO, 優先級)執行。

newCachedThreadPool創建一個可緩存線程池,
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

corePoolSize: 核心池的大小。 當有任務來之後,就會創建一個線程去執行任務,當線程池中的線程數目達到corePoolSize後,就會把到達的任務放到緩存隊列當中
maximumPoolSize: 線程池最大線程數,它表示在線程池中最多能創建多少個線程;
keepAliveTime: 表示線程沒有任務執行時最多保持多久時間會終止。
unit: 參數keepAliveTime的時間單位,有7種取值,在TimeUnit類中有7種靜態屬性:

newFixedThreadPool 創建一個定長線程池
在這裏插入圖片描述
在這裏插入圖片描述
這裏會發現 他會初始化讓我們傳個線程數,如下圖,他其實是核心池大小,最大線程數都已經固定,其他一樣
在這裏插入圖片描述
newScheduledThreadPool 創建一個定長線程池
在這裏插入圖片描述
實現 線程池底層
在這裏插入圖片描述
在這裏插入圖片描述

在執行線程方法可以定時 延遲幾秒執行

scheduledExecutorService.schedule(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName()+"," + temp);
                }
            },3, TimeUnit.SECONDS);

newSingleThreadExecutor 創建一個單線程化的線程池
在這裏插入圖片描述
會發現 打印出來的都是線程1 ,所以這個一個單線程的線程池
底層實現:會發現已經把核心池大小,最大數已經固定了
在這裏插入圖片描述

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