workQueue
上篇讲到Java核心的几个线程池都是对ThreadPoolExecutor类的封装,该类的构造方法中有个参数为workQueue。
该参数是指被提交但未执行的任务队列,它是一个BlockingQueue接口的对象,用于存放Runable对象。根据功能分类,在ThreadPoolExecutor类的构造函数中可使用以下几种BlockingQueue接口。
- 直接提交的队列:该功能有SynchronousQueue对象提供。使用该对象,提交的任务不会被真实的保存,而总是将新任务提交到线程执行,没有空闲线程时,则尝试创建新的线程,如果线程数量已经达到最大值,则执行拒绝策略。
- 有界的任务队列:该功能由ArrayBlockingQueue提供。使用该对象时,若有新任务需要执行,如果线程池的实际线程数少于corePoolSize,则会优先创建新的线程,若大于,则会将新任务加入到等待队列。当队列满时,则在总线程数不大于maximumPoolSize的前提下,创建新的线程执行任务。
- 无界的任务队列:该功能有LinkedBlockingQueue类实现。使用该对象时,除非系统资源耗尽,否则不存在入队失败的情况。当有新任务来时,若系统的线程数量小于corePoolSize,线程池会生成新的线程执行,当线程数达到corePoolSize时就不会再继续增加了,而是将任务加入到等待队列,该队列会保持无限增长。
- 优先任务队列:该功能由PriorityBlockingQueue实现。该类是一个特殊的无界队列。ArrayBlockingQueue和LinkedBlockingQueue都是按照先进先出处理任务,而该类则可以根据任务自身的优先级顺序先后执行。