java线程池七大参数(转)
转:https://blog.csdn.net/ye17186/article/details/89467919
从源码来看,线程池构造有七个参数,corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler
一、corePoolSize
核心线程池大小,线程池会维护一个最小线程数量,即使这些线程空闲,也不会被销毁;
如果有新任务进来,核心线程池已满的话,会先缓存到工作队列workQueue
二、maxmiumPoolSize
线程池最大线程数,如果新任务进来此时队列已满,但线程数未超过maximumPoolSize就会创建一个新线程,但不会无限创建,线程数最多不超过maximumPoolSize
三、keepAliveTime
空闲线程的存活时间,如果一个线程空闲且线程池中线程数超过核心线程池大小corePoolSize,则超过keepAliveTime后,这个线程就会被销毁
四、unit
keepAliveTime的单位
五、workQueue
用与缓存任务的工作队列,jdk提供了四种工作队列
5.1.ArrayBlockingQueue
基于数组的有界队列,可以有效防止线程资源耗尽的问题
5.2.LinkedBlockingQueue
基于链表的无界队列,使用此无界队列,会导致参数maxPoolSize不起作用
5.3.SynchronousQuene
不缓存任务的队列,生产者放入任务必须等到消费者取出任务,不会缓存,直接执行,没有可用线程,直接创建新线程,如果达到maximumPoolSize,执行拒绝策略
5.4.PriorityBlockingQueue
具有优先级的无界阻塞队列
六、threadFactory
线程工厂,创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等
七、handler
拒绝策略,jdk提供了四种拒绝策略
7.1.CallerRunsPolicy
该策略下,在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务
7.2.AbortPolicy
直接丢弃任务,并抛出RejectedExecutionException异常
7.3.DiscardPolicy
直接丢弃,什么都不做
7.4.DiscardOldestPolicy
丢弃进入队列最久的任务,然后把当前任务入队
线程池和装修公司
以运营一家装修公司做个比喻。公司在办公地点等待客户来提交装修请求;公司有固定数量的正式工以维持运转;旺季业务较多时,新来的客户请求会被排期,比如接单后告诉用户一个月后才能开始装修;当排期太多时,为避免用户等太久,公司会通过某些渠道(比如人才市场、熟人介绍等)雇佣一些临时工(注意,招聘临时工是在排期排满之后);如果临时工也忙不过来,公司将决定不再接收新的客户,直接拒单。
线程池就是程序中的“装修公司”,代劳各种脏活累活。上面的过程对应到线程池上:
// Java线程池的完整构造函数 public ThreadPoolExecutor( int corePoolSize, // 正式工数量 int maximumPoolSize, // 工人数量上限,包括正式工和临时工 long keepAliveTime, TimeUnit unit, // 临时工游手好闲的最长时间,超过这个时间将被解雇 BlockingQueue<Runnable> workQueue, // 排期队列 ThreadFactory threadFactory, // 招人渠道 RejectedExecutionHandler handler) // 拒单方式