java線程池對(duì)象ThreadPoolExecutor的深入講解
使用線程池的好處
1、降低資源消耗
可以重復(fù)利用已創(chuàng)建的線程降低線程創(chuàng)建和銷毀造成的消耗。
2、提高響應(yīng)速度
當(dāng)任務(wù)到達(dá)時(shí),任務(wù)可以不需要等到線程創(chuàng)建就能立即執(zhí)行。
3、提高線程的可管理性
線程是稀缺資源,如果無(wú)限制地創(chuàng)建,不僅會(huì)消耗系統(tǒng)資源,還會(huì)降低系統(tǒng)的穩(wěn)定性,使用線程池可以進(jìn)行統(tǒng)一分配、調(diào)優(yōu)和監(jiān)控
ThreadPoolExecutor 介紹:
java 提供的線程池類;
ThreadPoolExecutor 作用:
兩個(gè)作用:
1,用于分離執(zhí)行任務(wù)和當(dāng)前線程;
2,主要設(shè)計(jì)初衷:重復(fù)利用Thread 對(duì)象;
ThreadPoolExecutor 使用:
實(shí)例化:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
這是ThreadPoolExecutor的構(gòu)造方法之一,傳入?yún)?shù)最少,以下是參數(shù)說(shuō)明:
corePoolSize : 設(shè)置線程池的線程核心數(shù)量;該參數(shù)作用:當(dāng)向線程池中添加的任務(wù)數(shù)量小于核心數(shù)量時(shí),線程池將優(yōu)先創(chuàng)建新的線程,而不是重用之前已存在的線程(不管該線程可用與否);
源碼佐證,ThreadPoolExecutor 的 execute(Runnable) 方法中有源碼如下:
maximumPoolSize : 設(shè)置線程池可創(chuàng)建最大線程數(shù)量;該參數(shù)作用:用于限制線程池?zé)o限制的創(chuàng)建線程;
源碼佐證,ThreadPoolExecutor 的 addWorker(Runnable ,boolean) 方法中有源碼如下:
keepAliveTime : 設(shè)置線程池被創(chuàng)建線程的存活時(shí)間;
源碼佐證,ThreadPoolExecutor 的 getTask()方法中有源碼如下;源碼說(shuō)明:創(chuàng)建的線程將從任務(wù)隊(duì)列中獲取一個(gè)新的任務(wù),在keepAliveTime時(shí)間之后如果還未獲取到任務(wù),將關(guān)閉該線程;
unit :設(shè)置線程池線程存活時(shí)間的時(shí)間單位;
workQueue :設(shè)置線程池用于存放任務(wù)的隊(duì)列;
注意:ThreadPoolExecutor線程池是否創(chuàng)建新的線程不僅僅依賴于corePoolSize變量,還依賴于任務(wù)隊(duì)列的offer(E) 方法所返回的值;比如:想要?jiǎng)?chuàng)建一個(gè)cache線程池,就依賴于一個(gè)特殊的任務(wù)隊(duì)列:SynchronousQueue<E>;
源碼佐證,ThreadPoolExecutor 的execute(Runnable) 方法中有源碼如下:
示例: 創(chuàng)建固定線程池 和 cache線程池;
固定線程池,將corePoolSize 和 maximumPoolSize 設(shè)置相同即可,在Executors.newFixedThreadPool(10)有源碼示例:
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
cacahe線程池,需要傳入特殊的BlockingQueue對(duì)象,該對(duì)象需要在offer是返回false,并能夠在poll方法中監(jiān)聽到offer進(jìn)入的任務(wù);java 提供了一個(gè)SynchronousQueue類,該類就是這樣一個(gè)對(duì)象;在Executors.newCachedThreadPool()方法中,有源碼示例:
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
常用方法提示:
void execute(Runnable command) : 任務(wù)提交方法;線程池將順序執(zhí)行所提交的所有方法;
void shutdown() : 停止后續(xù)任務(wù)提交,但執(zhí)行完當(dāng)前線程池中所有任務(wù);該方法的作用:線程池將中斷當(dāng)前所有空閑的線程,但不保證一定中斷(可查看Thread的interrupt方法);那么工作中的線程將繼續(xù)工作,直到完成;
源碼:
public void shutdown() { final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { checkShutdownAccess(); advanceRunState(SHUTDOWN); interruptIdleWorkers(); 、//中斷所有空閑的線程 onShutdown(); // hook for ScheduledThreadPoolExecutor } finally { mainLock.unlock(); } tryTerminate(); }
List<Runnable> shutdownNow() : 立即終止線程池;該方法的作用:線程池將中斷所有創(chuàng)建的線程,但不保存一定中斷;線程池將所有剩余的任務(wù)從任務(wù)隊(duì)列中移除,不在執(zhí)行,并保存在一個(gè)List中返回給用于;
方法源碼:
public List<Runnable> shutdownNow() { List<Runnable> tasks; final ReentrantLock mainLock = this.mainLock; mainLock.lock(); try { checkShutdownAccess(); advanceRunState(STOP); interruptWorkers(); tasks = drainQueue(); } finally { mainLock.unlock(); } tryTerminate(); return tasks; }
ThreadPoolExecutor 任務(wù)執(zhí)行流程圖:
ThreadPoolExecutor 使用注意點(diǎn)說(shuō)明:
清晰需要使用的是那種類型的線程池,在實(shí)例化ThreadPoolExecutor時(shí),傳入的參數(shù)不同創(chuàng)建出來(lái)的線程池也將不同;尤其注意傳入BlockingQueue參數(shù),如果需要使用cache線程池,請(qǐng)確保BlockingQueue的offer方法反回false;可以參見SynchronousQueue類;
總結(jié):
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Java ThreadPoolExecutor 線程池的使用介紹
- java 定時(shí)器線程池(ScheduledThreadPoolExecutor)的實(shí)現(xiàn)
- java多線程CountDownLatch與線程池ThreadPoolExecutor/ExecutorService案例
- 詳解Java并發(fā)包中線程池ThreadPoolExecutor
- java線程池ThreadPoolExecutor的八種拒絕策略示例詳解
- Java并發(fā)包線程池ThreadPoolExecutor的實(shí)現(xiàn)
- Java創(chuàng)建線程池為什么一定要用ThreadPoolExecutor
- Java線程池?ThreadPoolExecutor?詳解
相關(guān)文章
SpringBoot獲取application.properties文件中文亂碼問(wèn)題及解決
這篇文章主要介紹了SpringBoot獲取application.properties文件中文亂碼問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05詳解SpringBoot結(jié)合swagger2快速生成簡(jiǎn)單的接口文檔
這篇文章主要介紹了詳解SpringBoot結(jié)合swagger2快速生成簡(jiǎn)單的接口文檔,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05SpringBoot實(shí)現(xiàn)單元測(cè)試示例詳解
單元測(cè)試(unit testing),是指對(duì)軟件中的最小可測(cè)試單元進(jìn)行檢查和驗(yàn)證。這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)單元測(cè)試的方法,需要的可以參考一下2022-11-11Mybatis分頁(yè)查詢的實(shí)現(xiàn)(Rowbounds和PageHelper)
本文主要介紹了Mybatis分頁(yè)查詢的實(shí)現(xiàn)(Rowbounds和PageHelper),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Java實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)頁(yè)截屏功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的簡(jiǎn)單網(wǎng)頁(yè)截屏功能,涉及java網(wǎng)頁(yè)打開及屏幕截圖功能相關(guān)操作技巧,需要的朋友可以參考下2017-12-12詳解ConcurrentHashMap如何保證線程安全及底層實(shí)現(xiàn)原理
這篇文章主要為大家介紹了ConcurrentHashMap如何保證線程安全及底層實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05