ThreadPoolExecutor学习

[size=large]一、构造函数[/size]

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue)
[b]corePoolSize[/b] 线程池维护的核心线程数。为什么这里说核心线程数而不是最小线程数是因为在线程池被创建后,并不会直接创建corePoolSize个线程,[color=red]而是[/color]等任务到来时临时创建。等按照需要创建了corePoolSize个线程之后,这些数量的线程即使闲置,也不会被线程池收回。这时即可以将这个值理解为线程池维护的最小线程数了。
[b] maximumPoolSize[/b] 线程池维护的最大线程数。
[b]keepAliveTime[/b] 当线程池中的线程数量大于corePoolSize,多出那部分数量的线程空闲keepAliveTime后会被收回。(线程池维护线程所允许的空闲时间)
[b] unit keepAliveTime[/b]的时间单位。可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
[b]workQueue[/b] 存放通过execute方法提交给线程等待执行的任务的队列。
[b] threadFactory[/b] 负责给线程池创建线程的工厂。
[b]handler[/b] 在当队列达到极限导致任务执行阻塞时执行的处理策略。handler有四个选择:ThreadPoolExecutor.AbortPolicy(抛出java.util.concurrent.RejectedExecutionException异常)。ThreadPoolExecutor.CallerRunsPolicy(重试添加当前的任务,他会自动重复调用execute方法)。ThreadPoolExecutor.DiscardOldestPolicy(抛弃旧的任务)。
ThreadPoolExecutor.DiscardPolicy(抛弃当前的任务)。
[b]说明:[/b]
一个任务通过execute(Runnable)方法添加到线程池,任务就是一个Runnable类型的对象,任务执行的方法就是Runnable类型对象的run()方法。

1)ThreadPoolExecutor会根据corePoolSize和maximumPoolSize的值调整线程池中线程的数量。当通过ThreadPoolExecutor.execute方法向线程池提交一个新的任务时,如果线程池当前线程数量小于corePoolSize,就算有线程空闲,[color=red]也会[/color]在创建一个线程执行这个任务;如果线程池当前线程数量大于corePoolSize又小于maximumPoolSize,只有当可用线程不够的时候才会创建新的线程。如果不希望系统动态增减线程数量,则将corePoolSize和maximumPoolSize数值设置为一样的值。如果将maximumPoolSize设置为一个特别大的值如Integer.MAX_VALUE,则ThreadPoolExecutor成为了一个能够容纳大量并发任务的线程池。一般来说corePoolSize和maximumPoolSize是在构造ThreadPoolExecutor对象时设置好的,当仍然可以调用ThreadPoolExecutor.setCorePoolSize 和ThreadPoolExecutor.setMaximumPoolSize 方法修改这两个属性。

[b]2)关于BlockQueue[/b]

当一个任务通过execute(Runnable)添加到线程池时:

a) 线程池中线程数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理刚添加的任务。
b) 线程池中线程数量等于于corePoolSize,但缓冲队列workQueue未满,任务放入缓冲队列
c)线程池中线程数量大于于corePoolSize,缓冲队列workQueue满,且线程池中线程数量小于maxmumPoolSize,建新的线程来处理被添加的任务
d) 线程池中线程数量大于于corePoolSize,缓冲队列workQueue满,且线程池中线程数量等于maxmumPoolSize,根据handle所指定的策略来处理任务

关于BlockQueue的选择,这篇文章分析的比较透彻
http://blog.csdn.net/feiyu8607/article/details/6872736
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值