面試官:線程池有哪些?分別的作用是什么?
常用的線程池有:
- newSingleThreadExecutor
- newFixedThreadExecutor
- newCacheThreadExecutor
- newScheduleThreadExecutor
1、newSingleThreadExecutor:
單個線程的線程池,即線程池中每次只有一個線程工作,單線程串行執行任務;
2、newFixedThreadExecutor:
固定數量的線程池,每提交一個任務就是一個線程,直到線程達到線程池的最大數量,然后后面進入等待隊列直到前面的任務才繼續執行;
3、newCacheThreadExecutor:
可緩存線程池,當線程池大小超過了處理任務所需的線程,那么就會回收部分空閑(一般 是60秒無執行)的線程,當有任務時,會添加新線程來執行;
4、newScheduleThreadExecutor:
大小無限制的 線程池,支持定時和周期性的執行線程。
ThreadPoolExecutor解說:
ThreadPoolExecutor是上面幾個線程池底層的實現,封裝了一層線程類worker,在運行的時候執行完自己的線程后主動去隊列中取下一條線程去執行。
其中完整的構造方法是:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { if (corePoolSize < 0 || maximumPoolSize <= 0 || maximumPoolSize < corePoolSize || keepAliveTime < 0) throw new IllegalArgumentException(); if (workQueue == null || threadFactory == null || handler == null) throw new NullPointerException(); this.corePoolSize = corePoolSize; this.maximumPoolSize = maximumPoolSize; this.workQueue = workQueue; this.keepAliveTime = unit.toNanos(keepAliveTime); this.threadFactory = threadFactory; this.handler = handler; }
- corePoolSize:線程池中所保存的線程數,包括空閑線程;
- maximumPoolSize:線程池中允許的最大線程數;
- keepAliveTime:線程存活時間,當超過keepAliveTime的時候后還無法獲取新的任務,則返回null;
- unit:keepAliveTime參數的時間單位;
- workQueue:執行前用於保持任務的隊列,此隊列僅保持由execute方法提交的Runnable任務;
- threadFactory:執行程序創建新線程時使用的工廠;
- handler:由於超出線程范圍和隊列容量而使用執行被阻塞時所使用的處理策略;
拒絕策略RejectedExecutionHandler有哪些,分別有什么作用:
- AbortPolicy:該策略是線程池默認策略;如果線程池隊列滿了丟掉這個任務並且拋出RejectedExecutionException異常。
- DiscardPolicy:如果線程池隊列滿了,會直接丟掉這個任務並且不會有任何異常。
- DiscarOldestPolicy:如果隊列滿了,會將最早進入隊列的任務刪掉騰出空間,再嘗試加入隊列。
- CallRunsPolicy:如果添加到線程池失敗,那么主線程會自己取執行該任務,不會等待線程池的線程取執行。
- 自定義策略