多线程ThreadPoolExecutor使用说明

ThreadPoolExecutor使用说明

 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

构造器中各个参数的含义:

1.corePoolSize


线程池中的核心线程数。当提交一个任务时,线程池创建一个新线程执行任务,
直到当前线程数等于corePoolSize;如果当前线程数为corePoolSize,继续提
交的任务被保存到阻塞队列中,等待被执行。

2.maximumPoolSize


线程池中允许的最大线程数。如果当前阻塞队列满了,且继续提交任务,则创建
新的线程执行任务,前提是当前线程数小于maximumPoolSize。

3.keepAliveTime


线程空闲时的存活时间。默认情况下,只有当线程池中的线程数大于corePoolSize
时,keepAliveTime才会起作用,如果一个线程空闲的时间达到keepAliveTime,则
会终止,直到线程池中的线程数不超过corePoolSize。但是如果调用了
allowCoreThreadTimeOut(boolean)方法,keepAliveTime参数也会起作用,直到
线程池中的线程数为0。

4.unit


keepAliveTime参数的时间单位。
例如TimeUnit.DAYS

 5.workQueue


任务缓存队列,用来存放等待执行的任务。如果当前线程数为corePoolSize,继续提交的
任务就会被保存到任务缓存队列中,等待被执行。

一般来说,这里的BlockingQueue有以下三种选择:
- SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作
,否则插入操作一直处于阻塞状态。因此,如果线程池中始终没有空闲线程(任务提交的平均速度快于
被处理的速度),可能出现无限制的线程增长。
- LinkedBlockingQueue:基于链表结构的阻塞队列,如果不设置初始化容量,其容量
Integer.MAX_VALUE,即为无界队列。因此,如果线程池中线程数达到了corePoolSize,且始终没有
空闲线程(任务提交的平均速度快于被处理的速度),任务缓存队列可能出现无限制的增长。
- ArrayBlockingQueue:基于数组结构的有界阻塞队列,按FIFO排序任务。

 6.threadFactory


线程工厂,创建新线程时使用的线程工厂。

7.handler


任务拒绝策略,当阻塞队列满了,且线程池中的线程数达到maximumPoolSize,如果继续提交任务,
就会采取任务拒绝策略处理该任务,线程池提供了4种任务拒绝策略:
- AbortPolicy:丢弃任务并抛出RejectedExecutionException异常,默认策略;
- CallerRunsPolicy:由调用execute方法的线程执行该任务;
- DiscardPolicy:丢弃任务,但是不抛出异常;
- DiscardOldestPolicy:丢弃阻塞队列最前面的任务,然后重新尝试执行任务(重复此过程)。
当然也可以根据应用场景实现RejectedExecutionHandler接口自定义饱和策略,如记录日志或持久
化存储不能处理的任务。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值