Java线程_线程调度之线程池(一)(三)

2014-11-24 03:05:47 · 作者: · 浏览: 6
alse, isTerminated: false [monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false [monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false [monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: false, isTerminated: false [monitor] [0/2] Active: 0, Completed: 6, Task: 6, isShutdown: true, isTerminated: true

代码来源:http://www.javacodegeeks.com/2013/01/java-thread-pool-example-using-executors-and-threadpoolexecutor.html

代码已经被笔者稍微改动了一下,因为原来的代码的打印信息不够,使得笔者在corePoolSize和maximumPoolSize时,看了老半天还是不懂为什么maximumPoolSize明明是4,最后却有6个任务被执行,4个任务被拒绝。后来笔者查找了很多文章,又添加了打印信息总算搞清楚了。

注意这里ThreadPoolExecutor的构造函数的第五个参数,就是那个workQueue参数,这里设定了一个长度为2的任务队列。再结合Java API中关于ThreadPoolExecutor的Rejected tasks段落的论述可知。当Executor已经关闭,或者最大线程(maximumPoolSize)和任务队列都饱和时,再添加进来的任务是会被拒绝的。本人更进一步的推论就是任务队列中存放的是等待启动的任务,当一个任务启动后他就会从任务队列中移动到具体的线程中,从而当支持的线程数和任务队列都已饱和时,线程池当然不能再接收更多的任务啦。

关于本文中用到的有界任务队列(ArrayBlockingQueue)以及corePoolSize和maximumPoolSize的数量关系可以稍加展开。

ArrayBlockingQueue是一个由数组支持的有界阻塞队列。此队列按 FIFO(先进先出)原则对元素进行排序。队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。

corePoolSize和maximumPoolSize:1)如果当前运行的线程数小于corePoolSize,则创建新线程来处理新的任务对象,即使有其他空闲线程的存在。2)如果当前运行的线程数大于corePoolSize,小于maximumPoolSize时,优先向任务队列中添加任务,只有当任务队列满时,才创建新线程。3)如果corePoolSize等于maximumPoolSize,则意味着创建了一个固定大小的线程池。

参考文章: http://my.oschina.net/zhdkn/blog/115048

O啦~~~

装载请保留出处:http://blog.csdn.net/u011638883/article/details/18547573

谢谢!!