JUC--線程池實現

什麼是線程池

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

線程池做用

線程池是爲忽然大量爆發的線程設計的,經過有限的幾個固定線程爲大量的操做服務,減小了建立和銷燬線程所需的時間,從而提升效率。若是一個線程的時間很是長,就不必用線程池了(不是不能做長時間操做,而是不宜。),何況咱們還不能控制線程池中線程的開始、掛起、和停止。緩存

線程池的分類

ThreadPoolExecutorJava是天生就支持併發的語言,支持併發意味着多線程,線程的頻繁建立在高併發及大數據量是很是消耗資源的,由於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 建立一個定長線程池,支持定時及週期性任務執行。app

newSingleThreadExecutor 建立一個單線程化的線程池,它只會用惟一的工做線程來執行任務,保證全部任務按照指定順序(FIFO, LIFO, 優先級)執行。框架

newCachedThreadPool建立一個可緩存線程池,圖片圖片圖片異步

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

newFixedThreadPool 建立一個定長線程池圖片圖片這裏會發現 他會初始化讓咱們傳個線程數,以下圖,他實際上是核心池大小,最大線程數都已經固定,其餘同樣圖片newScheduledThreadPool 建立一個定長線程池圖片實現 線程池底層圖片圖片函數

在執行線程方法能夠定時 延遲幾秒執行高併發

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

newSingleThreadExecutor 建立一個單線程化的線程池圖片會發現 打印出來的都是線程1 ,因此這個一個單線程的線程池 底層實現:會發現已經把核心池大小,最大數已經固定了圖片

相關文章
相關標籤/搜索