java之線程池面試題
阿新 • • 發佈:2018-11-15
超過 size 獲取 sched 限制 illegal this maximum schedule
面試官:線程池有哪些?分別的作用是什麽?
常用的線程池有:
- newSingleThreadExecutor
- newFixedThreadExecutor
- newCacheThreadExecutor
- newScheduleThreadExecutor
1、newSingleThreadExecutor:
單個線程的線程池,即線程池中每次只有一個線程工作,單線程串行執行任務;
2、newFixedThreadExecutor:
固定數量的線程池,每提交一個任務就是一個線程,直到線程達到線程池的最大數量,然後後面進入等待隊列直到前面的任務才繼續執行;
3、newCacheThreadExecutor:
可緩存線程池,當線程池大小超過了處理任務所需的線程,那麽就會回收部分空閑(一般 是60秒無執行)的線程,當有任務時,會添加新線程來執行;
4、newScheduleThreadExecutor:
大小無限制的 線程池,支持定時和周期性的執行線程。
ThreadPoolExecutor解說:
ThreadPoolExecutor是上面幾個線程池底層的實現;
其中完整的構造方法是:
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:由於超出線程範圍和隊列容量而使用執行被阻塞時所使用的處理策略;
java之線程池面試題