java常見面試題及答案(一)
一.Java執行緒池的介紹
使用執行緒池的好處
(1)降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。
(2)提高響應速度。當任務到達時,任務可以不需要的等到執行緒建立就能立即執行。
(3)提高執行緒的可管理性。執行緒是稀缺資源,如果無限制的建立,不僅會消耗系統資源,還會降低系統的穩定性,使用執行緒池可以進行統一的分配,調優和監控
原始碼分析,一共定義了四個構造器,前三個構造器最終都呼叫了第四個構造器進行初始化
public class ThreadPoolExecutor extends AbstractExecutorService { ..... public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler); public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler); ... }
構造器裡面引數的解釋
corePollSize:核心執行緒數。在建立了執行緒池後,執行緒中沒有任何執行緒,等到有任務到來時才建立執行緒去執行任務。預設情況下,在建立了執行緒池後,執行緒池中的執行緒數為0,當有任務來之後,就會建立一個執行緒去執行任務,當執行緒池中的執行緒數目達到corePoolSize後,就會把到達的任務放到快取隊列當中。
maximumPoolSize:執行緒池所能容納的最大執行緒數。當活動執行緒(核心執行緒+非核心執行緒)達到這個數值後,後續任務將會根據 RejectedExecutionHandler 來進行拒絕策略處理。
keepAliveTime:空閒的執行緒保留的時間。
TimeUnit
TimeUnit.DAYS; //天
TimeUnit.HOURS; //小時
TimeUnit.MINUTES; //分鐘
TimeUnit.SECONDS; //秒
TimeUnit.MILLISECONDS; //毫秒
TimeUnit.MICROSECONDS; //微妙
TimeUnit.NANOSECONDS; //納秒
BlockingQueue<Runnable>:阻塞佇列,儲存等待執行的任務。引數有ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue可選。
ThreadFactory:執行緒工廠,用來建立執行緒
RejectedExecutionHandler:佇列已滿,而且任務量大於最大執行緒的異常處理策略。有以下取值
ThreadPoolExecutor.AbortPolicy:丟棄任務並丟擲RejectedExecutionException異常。
ThreadPoolExecutor.DiscardPolicy:也是丟棄任務,但是不丟擲異常。
ThreadPoolExecutor.DiscardOldestPolicy:丟棄佇列最前面的任務,然後重新嘗試執行任務(重複此過程)
ThreadPoolExecutor.CallerRunsPolicy:由呼叫執行緒處理該任務
執行緒池工作原則:
1、當執行緒池中執行緒數量小於 corePoolSize 則建立執行緒,並處理請求。
2、當執行緒池中執行緒數量大於等於 corePoolSize 時,則把請求放入 workQueue 中,隨著執行緒池中的核心執行緒們不斷執行任務,只要執行緒池中有空閒的核心執行緒,執行緒池就從workQueue 中取任務並處理。
3、當 taskQueue 已存滿,放不下新任務時則新建非核心執行緒入池,並處理請求直到執行緒數目達到 maximumPoolSize(最大執行緒數量設定值)。
4、如果執行緒池中執行緒數大於 maximumPoolSize 則使用 RejectedExecutionHandler 來進行任務拒絕處理。
參考部落格地址:https://blog.csdn.net/maoruibin9035/article/details/71425379
https://blog.csdn.net/hsf15768615284/article/details/78261173