本篇文章為大家展示了 ThreadPoolExecutor如何在java中使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
java ThreadPoolExecutor
前言:
在項目中如果使用發短信這個功能,一般會把發短信這個動作變成異步的,因為大部分情況下,短信到底是發送成功或者失敗,都不能影響主流程。當然像發送MQ消息等操作也是可以封裝成異步操作的。
使用基本的New Thread
如果想一個操作變成異步的,可以直接new thread,然后在run方法中實現業務操作即可。例如:
new Thread(new Runnable() { public void run() { //發短信、發MQ消息等 } });
但是這種方式有幾個缺點。
1.每次都會new一個線程,執行完后銷毀,不能復用;
2.如果系統的并發量剛好比較大,需要大量線程,那么這種每次new的方式會搶資源的。
ThreadPoolExecutor
我們可以使用jdk1.5中的ThreadPoolExecutor來封裝異步操作。ThreadPoolExecutor的好處是可以做到線程復用,并且使用盡量少的線程去執行更多的任務,效率和性能都相當不錯。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; } }
參數介紹
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) { }
corePoolSize:當workQueue隊列中的元素還未到達最大值時,corePoolSize表示的池中線程數量的最大值;
maximumPoolSize:線程池中允許的最大線程數;
keepAliveTime:當前池中的線程數如果超過了corePoolSize,那么超出那些線程如果空閑太久了,應該需要銷毀的。keepAliveTime就是的是這些線程的最大空閑時間;
unit:keepAliveTime的時間單位;
workQueue:當池中線程數的數量已經達到了corePoolSize,那么如果請求還繼續過來,會把請求對應的task放入隊列中;
handler:當workQueue滿了,池中的線程數又達到了maximumPoolSize,這個時候已經沒有多余的資源處理請求了,需要RejectedExecutionHandler 來處理。拒絕處理或者丟棄任務等等。
執行過程
當沒有請求時,線程池中沒有任何線程;
當有請求時,創建線程,一直到池中的線程數等于corePoolSize;
如果請求太多,需要更多的線程來處理的話,ThreadPoolExecutor選擇把請求放入隊列中,暫時不新建線程;
如果workQueue也滿了,ThreadPoolExecutor會繼續創建線程,直到線程數量跟maximumPoolSize相等;
線程數達到maximumPoolSize了,同時workQueue也慢了,就只能把請求丟給RejectedExecutionHandler 來處理。
備注
使用ThreadPoolExecutor時,需要根據自己的業務情況,適當的指定參數值的大小。
上述內容就是 ThreadPoolExecutor如何在java中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。