首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

(转)ThreadPoolExecutor的实施顺序

2012-12-19 
(转)ThreadPoolExecutor的执行顺序ThreadPoolExecutor类关于排队是这样描述的:所有 BlockingQueue 都可用

(转)ThreadPoolExecutor的执行顺序
ThreadPoolExecutor类关于排队是这样描述的:

所有 BlockingQueue 都可用于传输和保持提交的任务。可以使用此队列与池大小进行交互:
如果运行的线程少于 corePoolSize,则 Executor 始终首选添加新的线程,而不进行排队。如果运行的线程等于或多于 corePoolSize,则 Executor 始终首选将请求加入队列,而不添加新的线程。如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。设想如下的情况,
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 失败
而并非我们希望的那样,顺序执行

http://blog.sina.com.cn/s/blog_4ada12a50100kkpx.html

热点排行