技術問答集錦(14)ThreadPoolExecutor

1 ThreadPoolExecutor構造器參數有哪些?分別什麼含義

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) 複製代碼
  1. corePoolSize:核心線程數,默認狀況下核心線程會一直存活,即便處於閒置狀態也不會受keepAliveTime限制。除非將allowCoreThreadTimeOut設置爲true
  2. maximumPoolSize:線程池所能容納的最大線程數。超過這個數的線程將被阻塞。當任務隊列爲沒有設置大小的LinkedBlockingDeque時,這個值無效
  3. keepAliveTime:非核心線程的閒置超時時間,超過這個時間就會被回收;
  4. unit:指定keepAliveTime的單位,如TimeUnit.SECONDS。當將allowCoreThreadTimeOut設置爲true時對corePoolSize生效
  5. workQueue:線程池中的任務隊列,經常使用的有三種隊列,SynchronousQueue,LinkedBlockingDeque,ArrayBlockingQueue
  6. threadFactory:線程工廠,提供建立新線程的功能;
  7. RejectedExecutionHandler handler:當線程池中的資源已經所有使用,添加新線程被拒絕時,會調用RejectedExecutionHandler的rejectedExecution方法。

2 ThreadPoolExecutor線程建立策略?

  1. 若是運行的 線程少於 corePoolSize,則 Executor 始終首選添加新的線程,而不進行排隊;
  2. 若是運行的 線程等於或多於 corePoolSize,則 Executor 始終首選將請求加入隊列,而不添加新的線程;
  3. 若是 沒法將請求加入隊列,則 建立新的線程
  4. 若是 線程數超出 maximumPoolSize,在這種狀況下,任務將被拒絕(執行拒絕策略)

3 ThreadPoolExecutor拒絕策略有哪些?

  1. 默認的 ThreadPoolExecutor.AbortPolicy 中,處理程序遭到拒絕將拋出運行時 RejectedExecutionException
  2. ThreadPoolExecutor.CallerRunsPolicy 中,線程調用運行該任務的 execute 自己。此策略提供簡單的反饋控制機制,可以減緩新任務的提交速度;
  3. ThreadPoolExecutor.DiscardPolicy 中,不能執行的任務將被刪除
  4. ThreadPoolExecutor.DiscardOldestPolicy 中,若是執行程序還沒有關閉,則 位於工做隊列頭部的任務將被刪除,而後重試執行程序(若是再次失敗,則重複此過程)

4 ThreadPoolExecutor參數中ThreadFactory有哪些實現類?

  1. DefaultThreadFactory:設置線程的優先級爲NORM(新建線程的優先級都是與其父線程保持一致);
  2. PrivilegedThreadFactory:繼承自DefaultThreadFactory,主要添加了訪問權限校驗;

5 FactoryPattern意義,其要解決什麼問題?

FactoryPattern:工廠模式,意義在於屏蔽使用者與實現者具體類緊耦合;java

6 ThreadPoolExecutor裏有三個鉤子方法,分別什麼做用?

// 任務執行前調用
protected void beforeExecute(Thread t, Runnable r) { }

// 任務結束後調用
protected void afterExecute(Runnable r, Throwable t) { }

// Executor終止前調用
protected void terminated() { }
複製代碼
相關文章
相關標籤/搜索