1. 程式人生 > >java常見面試題及答案(一)

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