ThreadPoolExecutor详解

Executor框架最核心的类是ThreadPoolExecutor,它是线程池的实现类。

关键词:

corePool:核心线程池的大小;

maximumPool:最大线程池的大小;

BlockingQueen:用来暂时保存任务的工作队列;

RejectedExecutionHandler:当ThreadPoolExecutor已经关闭或已经饱和时(达到最大线程池大小并且工作队列已满),execute()方法将要调用的Handler。


①FixedThreadPool详解:

被称为:可重用固定线程数的线程池。

public static ExecutorService newFixedThreadPool(int nThreads){
    return new ThreadPoolExecutor(nThreads,nThreads,TimeUnit.MILLISECONDS,new LinkedBlockingQueen<Runnable>());
}

FixedThreadPoo的corePoolSize和maximumPoolSize都被设置为创建FixedThreadPool时指定的参数nThreads。

当线程池中的线程数大于corePoolSize时,keepAliveTime为多余的空闲线程等待新任务的最长时间,超过这个时间多余的线程就会被终止。

这里把keepAliveTime设置为0L,说明一有空闲的线程会被立即终止。

执行过程:

1、当前线程数小于corePoolSize,则创建新线程来执行任务;

2、在线程池完成预热之后(线程数=corePoolSize),将任务加入LinkedBlockingQueen;

3、线程执行完1中的任务后,会从LinkedBlockingQueen中反复获取任务来执行;

FixedThreadPool采用无界队列LinkedBlockingQueen作为线程池的工作队列(队列的容量为Integer.MAX_VALUE)。

使用无界队列的影响:

1、线程数达到corePoolSize后,新任务会在无界队列中等待,线程数不会超过corePoolSize;

2、maximumPoolSize其实是一个无效参数;

3、keepAliveTime其实也是一个无效参数;

4、由于使用无界队列,FixedThreadPool不会拒绝任务。


SingleThreadExecutor简述:

除了corePoolSize和maximumPoolSize设置为1,其余与FixedThreadPool的参数相同。

也是使用无界队列LinkedBlockingQueen。


CachedThreadPool简述:

它会根据需要创建新线程。它的corePoolSize被设置为0,maximumPoolSize被设置为Integer.MAX_VALUE。

keepAliveTime被设置为60L,表示空闲线程等待新任务的时间最长为60s,超过将被终止。

它使用没有容量的SynchronousQueen作为线程池的工作队列,但CachedThreadPool的maximumPoolSize是无界的。

这意味着,如果主线程提交任务的速度高于maximumPoolSize中线程处理任务的速度,CachedThreadPool会不断创建新线程。

极端情况下,会因为创建过多新线程而好近CPU和内存资源。

SynchronousQueen:即每个插入操作(offer)必须等待另一个线程的对应移除操作(poll)。

具体步骤待补充。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值