- Offer來了:Java面試核心知識點精講(原理篇)
- 王磊
- 855字
- 2020-04-03 12:50:11
3.3 5種常用的線程池
Java定義了Executor接口并在該接口中定義了execute()用于執(zhí)行一個線程任務(wù),然后通過ExecutorService實現(xiàn)Executor接口并執(zhí)行具體的線程操作。ExecutorService接口有多個實現(xiàn)類可用于創(chuàng)建不同的線程池,如表3-2所示是5種常用的線程池。
表3-2

3.3.1 newCachedThreadPool
newCachedThreadPool用于創(chuàng)建一個緩存線程池。之所以叫緩存線程池,是因為它在創(chuàng)建新線程時如果有可重用的線程,則重用它們,否則重新創(chuàng)建一個新的線程并將其添加到線程池中。對于執(zhí)行時間很短的任務(wù)而言,newCachedThreadPool線程池能很大程度地重用線程進而提高系統(tǒng)的性能。
在線程池的keepAliveTime時間超過默認(rèn)的60秒后,該線程會被終止并從緩存中移除,因此在沒有線程任務(wù)運行時,newCachedThreadPool將不會占用系統(tǒng)的線程資源。
在創(chuàng)建線程時需要執(zhí)行申請CPU和內(nèi)存、記錄線程狀態(tài)、控制阻塞等多項工作,復(fù)雜且耗時。因此,在有執(zhí)行時間很短的大量任務(wù)需要執(zhí)行的情況下,newCachedThreadPool能夠很好地復(fù)用運行中的線程(任務(wù)已經(jīng)完成但未關(guān)閉的線程)資源來提高系統(tǒng)的運行效率。具體的創(chuàng)建方式如下:
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
3.3.2 newFixedThreadPool
newFixedThreadPool用于創(chuàng)建一個固定線程數(shù)量的線程池,并將線程資源存放在隊列中循環(huán)使用。在newFixedThreadPool線程池中,若處于活動狀態(tài)的線程數(shù)量大于等于核心線程池的數(shù)量,則新提交的任務(wù)將在阻塞隊列中排隊,直到有可用的線程資源,具體的創(chuàng)建方式如下:
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
3.3.3 newScheduledThreadPool
newScheduledThreadPool創(chuàng)建了一個可定時調(diào)度的線程池,可設(shè)置在給定的延遲時間后執(zhí)行或者定期執(zhí)行某個線程任務(wù):
ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); //1:創(chuàng)建一個延遲3秒執(zhí)行的線程 scheduledThreadPool.schedule(newRunnable(){ @Override public void run() { System.out.println("delay 3 seconds execu."); }}, 3, TimeUnit.SECONDS); //2:創(chuàng)建一個延遲1秒執(zhí)行且每3秒執(zhí)行一次的線程 scheduledThreadPool.scheduleAtFixedRate(newRunnable(){ @Override public void run() { System.out.println("delay 1 seconds, repeat execute every 3 seconds"); }},1,3, TimeUnit.SECONDS);
3.3.4 newSingleThreadExecutor
newSingleThreadExecutor線程池會保證永遠有且只有一個可用的線程,在該線程停止或發(fā)生異常時,newSingleThreadExecutor線程池會啟動一個新的線程來代替該線程繼續(xù)執(zhí)行任務(wù):
ExecutorService singleThread = Executors.newSingleThreadExecutor();
3.3.5 newWorkStealingPool
newWorkStealingPool創(chuàng)建持有足夠線程的線程池來達到快速運算的目的,在內(nèi)部通過使用多個隊列來減少各個線程調(diào)度產(chǎn)生的競爭。這里所說的有足夠的線程指JDK根據(jù)當(dāng)前線程的運行需求向操作系統(tǒng)申請足夠的線程,以保障線程的快速執(zhí)行,并很大程度地使用系統(tǒng)資源,提高并發(fā)計算的效率,省去用戶根據(jù)CPU資源估算并行度的過程。當(dāng)然,如果開發(fā)者想自己定義線程的并發(fā)數(shù),則也可以將其作為參數(shù)傳入。
- 程序員面試筆試寶典(第3版)
- Vue.js設(shè)計與實現(xiàn)
- Spring 5.0 By Example
- INSTANT OpenCV Starter
- Python數(shù)據(jù)可視化:基于Bokeh的可視化繪圖
- Python入門很簡單
- C語言程序設(shè)計
- HTML5 and CSS3 Transition,Transformation,and Animation
- 零基礎(chǔ)輕松學(xué)SQL Server 2016
- 數(shù)據(jù)結(jié)構(gòu)與算法分析(C++語言版)
- PySide 6/PyQt 6快速開發(fā)與實戰(zhàn)
- Node.js開發(fā)指南
- JSP程序設(shè)計與案例實戰(zhàn)(慕課版)
- Java程序設(shè)計實用教程(第2版)
- UI動效設(shè)計從入門到精通