(转)ThreadPoolExecutor的执行顺序

[size=medium]ThreadPoolExecutor类关于排队是这样描述的:

所有 BlockingQueue 都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:
[list]
[*]如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。
[*]如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。
[*]如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。[/list]
设想如下的情况,
corePoolSize=2
maximumPoolSize=6
队列大小为10
有20个任务,每个任务都需要10s才能完成,现在一次性将20个任务都放入线程池中,执行的顺序是怎么样的呢?

Thread1放入线程池,当前线程少于2,直接创建新的线程,执行
Thread2放入线程池,当前线程少于2,直接创建新的线程,执行
Thread3放入线程池,当前线程等于2,队列大小为0,加入队列,等待执行
……
Thread12放入线程池,当前线程等于2,队列大小为9,加入队列,等待执行
Thread13放入线程池,当前线程等于2,队列大小为10,无法加入队列,创建新的线程,执行
……
Thread16放入队列,当前线程等于5,队列大小为10,无法加入队列,创建新的线程,执行
Thread17放入队列,当前线程等于6,队列大小为10,无法加入队列,任务失败
……

通过以上的分析,我们发现线程池中线程的执行顺序是
1,2,13,14,15,16,3,4,5,6,7,8,9,10
17,18,19,20 失败
而并非我们希望的那样,顺序执行

[url]http://blog.sina.com.cn/s/blog_4ada12a50100kkpx.html[/url]
[/size]
--------------------- 
作者:iteye_1982 
来源:CSDN 
原文:https://blog.csdn.net/iteye_1982/article/details/82042031 
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:((转)ThreadPoolExecutor的执行顺序)