所谓线程池七参数,是指使用ThreadPoolExecutor创建线程池时设置的七个参数,如下源码所示:publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,longkeepAliveTime,TimeUnitunit,BlockingQueueworkQueue,ThreadFactorythreadFactory,RejectedExecutionHandlerhandler){//...}七个参数分别是:corePoolSize:核心线程数。maximumPoolSize:最大线程数。keepAliveTime:空闲线程存活时间。TimeUnit:时间单位。BlockingQueue:线程池任务队列。ThreadFactory:创建线程的工厂。RejectedExecutionHandler:拒绝策略。参数一:corePoolSize核心线程数:指线程池中长期存活的线程数。这就好比古代的大家族,他们会雇佣一些“长工”长期为他们工作。这些人一般都比较稳定。不管他们今年工作多少,这些人都不会被辞退。别人的。参数2:maximumPoolSize最大线程数:线程池允许创建的最大线程数,当线程池的任务队列满时,可以创建的最大线程数。这是古代一个大家族所能雇用的最多人数。比如某个节日或者大家庭有人过生日,因为工作太多,光靠“长工”是无法完成任务的。这时候,一些“短工”会一起被招进来。对于工作,最大线程数是“长工”+“短工”的总和,即招募的数量不能超过maximumPoolSize。注意事项最大线程数maximumPoolSize的值不能小于核心线程数corePoolSize,否则程序运行时会报IllegalArgumentException,如下图:参数3:keepAliveTime空闲线程存活时间,当线程池中没有任务时,会销毁部分线程,销毁的线程数=maximumPoolSize(最大线程数)-corePoolSize(核心线程数)。还是以大家庭为例,大家庭忙的时候,会雇一些“打工”来干活,但干完活,这些“打工”不忙的时候就会被辞退,而keepAliveTime是用来描述一个短工在没有工作之后,可以在大家庭的家庭中停留的(最大)时间。参数4:TimeUnit时间单位:空闲线程存活时间的描述单位。该参数与参数3配合使用,参数3为long型值。比如参数3传1,那么这个1就是1天?还是1小时?还是1秒?参数4说了算。TimeUnit有以下7个值:TimeUnit.DAYS:天TimeUnit.HOURS:小时TimeUnit.MINUTES:分钟TimeUnit.SECONDS:秒TimeUnit.MILLISECONDS:毫秒TimeUnit.MICROSECONDS:微秒TimeUnit.NANOSECONDS:纳秒参数5:BlockingQueue阻塞队列:queueforstoringtasksinthethreadpool用于存储线程池中所有待处理的任务。它可以设置如下值:ArrayBlockingQueue:由数组结构组成的有界阻塞队列。LinkedBlockingQueue:由链表结构组成的有界阻塞队列。SynchronousQueue:不存储元素的阻塞队列,即不持有元素直接提交给线程。PriorityBlockingQueue:无界阻塞队列,支持优先级排序。DelayQueue:使用优先级队列实现的无界阻塞队列,只有在延迟到期时才能从中提取元素。LinkedTransferQueue:由链表结构组成的无界阻塞队列。类似于SynchronousQueue,也包含非阻塞方法。LinkedBlockingDeque:由链表结构组成的双向阻塞队列。LinkedBlockingQueue比较常用,线程池的排队策略与BlockingQueue密切相关。参数6:ThreadFactory线程工厂:线程池创建线程时调用的工厂方法。通过该方法可以设置线程优先级、线程命名规则、线程类型(用户线程或守护线程)。使用线程工厂的例子如下:thread线程池中的Threadthread=newThread(r);//设置线程名称thread.setName("Thread-"+r.hashCode());//设置线程优先级(最大值:10)thread.setPriority(Thread.MAX_PRIORITY);//...返回线程;}};//创建线程池ThreadPoolExecutorthreadPoolExecutor=newThreadPoolExecutor(10,10,0,TimeUnit.SECONDS,newLinkedBlockingQueue<>(),threadFactory);//使用自定义线程工厂threadPoolExecutor.submit(newRunnable(){@Overridepublicvoidrun(){Threadthread=Thread.currentThread();System.out.println(String.format("线程:%s,线程优先级:%d",thread.getName(),thread.getPriority()));}});}上面程序的执行结果如下:从上面的执行结果可以看出,自定义线程工厂起作用了。线程的名称和线程的优先级由线程工厂设置。默认有四种拒绝策略:AbortPolicy:拒绝并抛出异常。CallerRunsPolicy:使用当前调用线程来执行这个任务。DiscardOldestPolicy:丢弃队列头部(最旧)的任务并执行当前任务。DiscardPolicy:忽略并丢弃当前任务。线程池的默认策略是AbortPolicy来拒绝并抛出异常。总结本文介绍了线程池的七个参数:corePoolSize:核心线程数,正常情况下线程池持有的线程数,大家庭的“长工”数。maximumPoolSize:最大线程数,线程池繁忙时可以拥有的最大线程数,大家族“长工”+“短工”的总和。keepAliveTime:空闲线程的存活时间,“短时工”在没有活动后可以存活的最长时间。TimeUnit:时间单位,与参数3一起使用,用于描述参数3的时间单位。BlockingQueue:线程池的任务队列,用于保存线程池要执行的任务的容器。ThreadFactory:线程工厂,用于在线程池中创建线程的工厂方法,通过它可以设置线程的命名规则、优先级和线程类型。RejectedExecutionHandler:拒绝策略,当任务量超过线程池可保存的最大任务数时,执行策略。判断是非在自己,名誉在别人,得失在人数。公众号:Java面试真题分析面试合集:https://gitee.com/mydb/interview