[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
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