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) // 拒单方式

 

posted @ 2023-09-03 10:03  Mars.wang  阅读(167)  评论(0编辑  收藏  举报