Java的线程池有哪些重要参数?如何实现激进的线程池?

1.重要参数:7个

int corePoolSize,//线程池的核心线程数量

int maximumPoolSize,//线程池的最大线程数

long keepAliveTime,//当线程数大于核心线程数时,多余的空闲线程存活的最长时间

TimeUnit unit,//时间单位

BlockingQueue workQueue,//任务队列,用来储存等待执行任务的队列

ThreadFactory threadFactory,//线程工厂,用来创建线程

RejectedExecutionHandler handler //拒绝策略,当提交的任务过多而不能及时处理时,我们可以定制策略来处理任务

拒绝策略包含以下 4 种:

①CallerRunsPolicy:提交任务的线程自己去执行该任务。

②AbortPolicy:默认的拒绝策略,会 throws RejectedExecutionException。

③DiscardPolicy:直接丢弃任务,没有任何异常抛出。

④DiscardOldestPolicy:丢弃最老的任务,把最早进入工作队列的任务丢弃,然后把新任务加入到工作队列。

 

2.实现激进的线程池:

线程池默认的工作方式是:当核心线程满了之后不会立即扩容线程池,而是把任务堆积到工作队列中。当工作队列满了后扩容线程池,一直到线程个数达到 maximumPoolSize 为止。而实现激进的线程池可以通过:先把最大线程数用完,然后再提交任务到队列里面去。

例如 Tomcat线程池的实现思路:

①重写任务队列的 offer 方法。使线程池在提交任务时判断:若当前正在运行的线程数少于最大线程数时,就创建新线程。

②实现一个自定义的拒绝策略处理程序。如果队列满了,则会等待指定时间后再次放入队列。如果再次放入队列的时候还是满的,则抛出拒绝异常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值