java ThreadPoolExecutor使用方法簡單介紹
java ThreadPoolExecutor
前言:
在項(xiàng)目中如果使用發(fā)短信這個(gè)功能,一般會(huì)把發(fā)短信這個(gè)動(dòng)作變成異步的,因?yàn)榇蟛糠智闆r下,短信到底是發(fā)送成功或者失敗,都不能影響主流程。當(dāng)然像發(fā)送MQ消息等操作也是可以封裝成異步操作的。
使用基本的New Thread
如果想一個(gè)操作變成異步的,可以直接new thread,然后在run方法中實(shí)現(xiàn)業(yè)務(wù)操作即可。例如:
new Thread(new Runnable() { public void run() { //發(fā)短信、發(fā)MQ消息等 } });
但是這種方式有幾個(gè)缺點(diǎn)。
1.每次都會(huì)new一個(gè)線程,執(zhí)行完后銷毀,不能復(fù)用;
2.如果系統(tǒng)的并發(fā)量剛好比較大,需要大量線程,那么這種每次new的方式會(huì)搶資源的。
ThreadPoolExecutor
我們可以使用jdk1.5中的ThreadPoolExecutor來封裝異步操作。ThreadPoolExecutor的好處是可以做到線程復(fù)用,并且使用盡量少的線程去執(zhí)行更多的任務(wù),效率和性能都相當(dāng)不錯(cuò)。demo代碼如下:
public class ThreadPool { private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(8, 12, 30, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(50000), new ThreadPoolExecutor.AbortPolicy()); public static ThreadPoolExecutor getThreadPool() { return threadPool; } }
參數(shù)介紹
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { }
corePoolSize:當(dāng)workQueue隊(duì)列中的元素還未到達(dá)最大值時(shí),corePoolSize表示的池中線程數(shù)量的最大值;
maximumPoolSize:線程池中允許的最大線程數(shù);
keepAliveTime:當(dāng)前池中的線程數(shù)如果超過了corePoolSize,那么超出那些線程如果空閑太久了,應(yīng)該需要銷毀的。keepAliveTime就是的是這些線程的最大空閑時(shí)間;
unit:keepAliveTime的時(shí)間單位;
workQueue:當(dāng)池中線程數(shù)的數(shù)量已經(jīng)達(dá)到了corePoolSize,那么如果請求還繼續(xù)過來,會(huì)把請求對應(yīng)的task放入隊(duì)列中;
handler:當(dāng)workQueue滿了,池中的線程數(shù)又達(dá)到了maximumPoolSize,這個(gè)時(shí)候已經(jīng)沒有多余的資源處理請求了,需要RejectedExecutionHandler 來處理。拒絕處理或者丟棄任務(wù)等等。
執(zhí)行過程
當(dāng)沒有請求時(shí),線程池中沒有任何線程;
當(dāng)有請求時(shí),創(chuàng)建線程,一直到池中的線程數(shù)等于corePoolSize;
如果請求太多,需要更多的線程來處理的話,ThreadPoolExecutor選擇把請求放入隊(duì)列中,暫時(shí)不新建線程;
如果workQueue也滿了,ThreadPoolExecutor會(huì)繼續(xù)創(chuàng)建線程,直到線程數(shù)量跟maximumPoolSize相等;
線程數(shù)達(dá)到maximumPoolSize了,同時(shí)workQueue也慢了,就只能把請求丟給RejectedExecutionHandler 來處理。
備注
使用ThreadPoolExecutor時(shí),需要根據(jù)自己的業(yè)務(wù)情況,適當(dāng)?shù)闹付▍?shù)值的大小。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- java 定時(shí)器線程池(ScheduledThreadPoolExecutor)的實(shí)現(xiàn)
- Java線程池ThreadPoolExecutor原理及使用實(shí)例
- java中ThreadPoolExecutor常識匯總
- Java ThreadPoolExecutor 線程池的使用介紹
- Java自帶定時(shí)任務(wù)ScheduledThreadPoolExecutor實(shí)現(xiàn)定時(shí)器和延時(shí)加載功能
- java ThreadPoolExecutor 并發(fā)調(diào)用實(shí)例詳解
- Java ThreadPoolExecutor的參數(shù)深入理解
- java中Executor,ExecutorService,ThreadPoolExecutor詳解
- 詳解Java并發(fā)包中線程池ThreadPoolExecutor
相關(guān)文章
關(guān)于Mybatis與JPA的優(yōu)缺點(diǎn)說明
這篇文章主要介紹了關(guān)于Mybatis與JPA的優(yōu)缺點(diǎn)說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06Spring ApplicationContextAware 接口的作用及使用方式
Spring提供了許多回調(diào)接口,用于Bean生命周期中執(zhí)行特定的操作,通過實(shí)現(xiàn)ApplicationContextAware接口,Spring提供了一種便捷的方式讓 Bean獲取對Spring容器的引用,本文介紹ApplicationContextAware接口的作用、使用方式,以及在實(shí)際應(yīng)用中的常見場景,感興趣的朋友一起看看吧2024-01-01springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源)
在開發(fā)過程中,很多時(shí)候都會(huì)有垮數(shù)據(jù)庫操作數(shù)據(jù)的情況,需要同時(shí)配置多套數(shù)據(jù)源,本文主要介紹了springboot配置多數(shù)據(jù)源(靜態(tài)和動(dòng)態(tài)數(shù)據(jù)源),感興趣的可以了解一下2023-09-09避免sql注入_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了避免sql注入,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08詳解自動(dòng)注冊Gateway網(wǎng)關(guān)路由配置
這篇文章主要為大家介紹了自動(dòng)注冊Gateway網(wǎng)關(guān)路由配置的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Spring XML Schema擴(kuò)展機(jī)制的使用示例
所謂整合,即在Spring的框架下進(jìn)行擴(kuò)展,讓框架能無縫的與Spring工程配合使用。Spring設(shè)計(jì)了良好的擴(kuò)展的機(jī)制,本文將對Spring的擴(kuò)展方法及原理進(jìn)行簡單介紹。2021-05-05Java 使用Docker時(shí)經(jīng)常遇到的五個(gè)問題
這篇文章主要介紹了Java 使用Docker時(shí)經(jīng)常遇到的五個(gè)問題的相關(guān)資料,需要的朋友可以參考下2016-10-10