public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
1、corePoolSize线程池中的常驻核心线程数
2、maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1
3、keepAliveTime:多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁
直到剩下corePoolSize个线程为止。
默认情况下:只有当线程池中的线程数大于corePoolSize时keepAliveTime才会起作用,知道线程中的线程
数不大于corepoolSIze。
4、Unit:keepAliveTime的单位
5、WorkQueue:任务队列,被提交但尚未被执行的任务
6、ThreadFactory:表示生成线程池中工作线程的线程工厂,用户创建新线程,一搬用默认即可
7、Handler:拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大线程数
(maximumPoolSize)时如何来拒绝请求执行的runnable的策略
心得:
当线程池中corePoolSize使用完毕之后,多出来的任务就会进入缓存队列;
当缓存队列也存放满了之后,还有大量的任务,这时将会创建线程池中支持的最大量的线程,然后执行缓存队列里面的任务,而外面的任务进入缓存队列中;当线程池中的线程达到最大时,缓存队列也存满之后,这时该线程池将会执行拒绝策略。
JDK内置的拒绝策略
- AbortPolicy(默认):直接抛出RejectedException异常阻止系统正常运行
- CallerRuns Policy:”调用者运行”一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。
- DiscardOldestPolicy:抛弃队列中等待最久对的任务,然后把当前任务加入队列中尝试再次提交当前任务。
4.DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常,如果允许任务丢失,这是最好的一种方案。