Java线程池 ThreadPoolExecutor

1.java原生线程池ThreadPoolExecutor构造方法定义:

 

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

 

 

 

java.util.concurrent.ThreadPoolExecutor.ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler)

 

 

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

 

 

 

参数说明:

 

corePoolSize : 池中所保存的线程数,包括空闲线程。

maximumPoolSize : 池中允许的最大线程数。

keepAliveTime : 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间。

unit : keepAliveTime 参数的时间单位。

workQueue : 执行前用于保持任务的队列。此队列仅保持由 execute方法提交的 Runnable任务。

threadFactory : 执行程序创建新线程时使用的工厂。

handler : 由于超出线程范围和队列容量而使执行被阻塞时所使用的处理程序。

 

现在在项目中使用到的是第二种,但知其然不知其所以然,记录一下,慢慢深入了解。

 

new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(),new ThreadPoolExecutor.CallerRunsPolicy());

其中workQueue使用LinkedBlockingQueue<Runnable>(),BlockingQueue有三种类型:直接提交,有界队列,无界队列。

所有BlockingQueue 都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:

如果运行的线程少于 corePoolSize,则 Executor始终首选添加新的线程,而不进行排队。如果当前运行的线程小于corePoolSize,则任务根本不会存放,添加到queue中,而是直接抄家伙(thread)开始运行。

如果运行的线程等于或多于 corePoolSize,则 Executor始终首选将请求加入队列,而不添加新的线程。

如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。

排队三种策略:

直接提交

有界队列

无界队列:使用无界队列(例如,不具有预定义容量的 LinkedBlockingQueue)将导致在所有corePoolSize 线程都忙时新任务在队列中等待。这样,创建的线程就不会超过 corePoolSize。(因此,maximumPoolSize的值也就无效了。)当每个任务完全独立于其他任务,即任务执行互不影响时,适合于使用无界队列;例如,在 Web页服务器中。这种排队可用于处理瞬态突发请求,当命令以超过队列所能处理的平均数连续到达时,此策略允许无界线程具有增长的可能性。

 

 

参看资料:http://www.oschina.net/question/565065_86540

 

你可能感兴趣的:(java,线程池)