Java并发编程之ThreadPoolExecutor的使用

构造方法


类ThreadPoolExecutor最常用的构造方法是:

ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime
            ,TimeUnit unit,BlockingQueue<Runnable> workQueue)

corePoolSize:线程池中标准的线程数
maximumPoolSize:线程池中允许的最大线程数
keepAliveTime:超时时间,如果实际线程大于标准线程数,超过的部分将在超时时间过后从空闲线程中删除
unit:keepAliveTime参数的时间单位
workQueue:执行前用于保持任务的队列。此队列仅保持由execute方法提交的Runnable任务



获取基本属性的一些方法


getCorePoolSize() //获取corePoolSize
getMaximumPoolSize() //获取maximumPoolSize
getPoolSize() //获取线程池中线程实际数量



线程池工作过程


1、当线程池刚创建的时候,里面没有一个线程,任务队列作为参数传进来,不过,就算队列里有任务,线程池也不会马上执行。
2、当执行executor()方法添加一个任务时,线程池会做如下判断
a)如果正在运行的线程数量小于等于corePoolSize,那么马上创建线程运行该任务
b)如果正在运行的线程数量大于corePoolSize,那么将这个任务放入队列
c)如果队列满了,并且正在运行的队列小于maximumPoolSize,创建线程直接加入线程池中。
d)如果队列满了,并且正在运行的队列大于或等于maximumPoolSize,线程池抛出 RejectExecutionException异常
3、当一个线程完成任务,将从队列中取出下一个任务来执行。
4、当一个线程处于空闲状态,超过一定时间(keepAliveTime),线程池会判断,如果当前线程池中的线程超过corePoolSize,那么该线程将会被删除,最终当线程池中的所有任务都完成后,线程的数量会是corePoolSize


ThreadPoolExecutor相关方法


shutdown()方法
当前任务继续执行,无法添加新的任务,否则将会抛出异常,当任务执行完成后,进程结束。

shutdownNow()方法
中断所有任务,并且抛出InterruptedException异常,前提是Runnable中使用

if(Thread.currentThread().isInterrupted()==true){
    throw new InterruptedException();
}

isShutdown()方法
作用是判断线程是否已经关闭,只要调用了shutdown()方法,isShutdown()方法的返回值就是true

isTerminating()和isTerminated()方法
如果程序处于shutdown 或shutdownNow 之后处于正在终止但尚未完全终止的过程中,调用方法 isTerminating(),返回true。
如果线程池关闭后,即任务都完成,则方法isTerminated()返回true。


常见的3种队列结合max值的因果效果


使用ThreadPoolExecutor线程池的过程中,常用到3种队列
ArrayBlockingQueue、LinkedBlockingDeque和SynchronousQueue。
ArrayBlockingQueue和LinkedBlockingDeque类可以指定队列存储元素的个数,如果未指定个数,默认为 Integer.MAX_VALUE。

对于ArrayBlockingQueue和LinkedBlockingDeque队列
当任务数大于corePoolSize时,多出的部分将会被放入队列中,如果队列满了,将会判断当前线程池中的线程是否超过maximumPoolSize,如果不超过,创建新线程执行任务,如果超过,抛出异常。

对于SynchronousQueue队列
SynchronousQueue队列没有容量,当任务数量大于corePoolSize时,直接创建新的线程,当线程数量大于maximumPoolSize时,抛出异常。


线程池ThreadPoolExecutor的拒绝策略


线程池中的资源全部被占用的时候,对新添加的Task任务有不同的处理策略,在默认情况下,ThreadPoolExecutor类有4种不同的处理方式。

  • AbortPolicy:当任务添加到线程池中被拒绝时,它将抛出RejectExecutionException异常。
  • CallerRunsPolicy:当任务添加到线程池中被拒绝时,会直接使用调用者的线程,执行当前任务,调用者的线程执行性能极有可能急剧下降,因此不建议这么做。
  • DiscardOldestPolicy:当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
  • DiscardPolicy:当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值