引語
在學習了線程與多線程的相關知識后,我們已經能夠實現在程序中使多個任務并行,但是我們在操作時候,往往每執行一個的任務就需要創建一個新的線程。這種方式在需要執行任務很多時不利于我們對線程的管理,且創建過多線程也非常占用資源,那么有沒有一種方便我們管理線程,控制線程數量導致的資源占用,又能高效處理任務的方式呢?
在Java中,針對頻繁創建線程導致的資源浪費、管理復雜的問題,線程池可以說是最優解決方案。顧名思義,它就像人工養殖的線程池塘,可以幫助我們很好的管理線程的創建和執行。
組成
關于線程池是如何實現線程高效管理的,我們不妨先來解析一下線程池的結構,線程池大致可以分為:線程管理器、工作線程、工作隊列三個部分
線程管理器:線程創建,回收,處理的管理器,是操作線程池內線程的主要部分
工作線程:實際執行任務的線程,包括核心線程和臨時線程
工作隊列:存儲待處理任務的阻塞隊列,工作線程會從這里取出任務執行
執行原理
通過線程管理器、工作線程、工作隊列三個部分協同工作,線程池就能夠實現高效工作,具體實現原理如下:
線程池在使用時,首先會接收任務對象,放入任務隊列當中,如果工作線程中存在空閑的線程,那么空閑的工作線程會取出任務隊列中的任務并執行。
而工作線程中的線程分為兩種,核心線程和臨時線程,核心線程是工作線程中始終存活的線程,線程管理器會在初始化時就創建好核心線程。而臨時線程是在核心線程已滿且任務隊列也滿的情況下創建的線程,臨時線程在一段時間沒有接到任何任務后會被線程管理器自行關閉,防止占用不必要的系統資源。
且核心線程數與臨時線程數之和不得超過最大線程數,防止占用的資源過多導致出現問題。
官方實現
Java官方給出了 ThreadPoolExecutor 類作為實現線程池的實現類,我們來看看它的使用方法:
//構造方法
public ThreadPoolExecutor(int corePoolSize, //線程池核心線程數量int maximumPoolSize, //線程池最大線程數量long keepAliveTime, //指定臨時線程的存活時間TimeUnit unit, //臨時線程存活的時間單位SlockingQueue<Runnable> workQueue, //指定線程池的任務隊列ThreadFactory threadfactory, //指定線程池的線程工廠RejectedExecutionHandler handler //線程池的任務拒絕策略
);
//任務提交
public void execute(Runnable r);