1.java原生线程池ThreadPoolExecutor构造方法定义:
?
class="java"> 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
?