线程池的创建
ThreadFactory使用默认的Executors.defaultThreadFactory()
ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
corePoolSize:
核心线程数,即使处于空闲状态,也要保留在池中的线程数,除非将allowCoreThreadTimeOut设置为true。当提交一个任务到线程池时,线程池会创建一个新的线程来执行任务,即使其它空闲的线程能够执行新的任务也会创建线程,等到需要执行的任务数大于corePoolSize时,就不再创建。新的任务将加入BlockingQueue中。
maximumPoolSize:
线程池所能容纳的最大线程数。如果队列满了,并且已创建的线程数小于maximumPoolSize,则线程池会创建新的线程执行任务。如果使用了无界的任务队列,那么maximumPoolSize这个参数就没有效果。
keepAliveTime:
线程池的工作线程空闲后,保持的存活时间。如果任务很多,并且执行的时间比较短,可以调大时间,提高线程的利用率。
workQueue:
任务队列。用于保存等待执行的任务的阻塞队列。常用的有:
(1)ArrayBlockingQueue:一个基于数组结构的有界阻塞队列,此队列按FIFO原则对元素进行排序。
(2)LinkedBlockingQueue:一个基于链表结构的有界阻塞队列,此队列按FIFO原则对元素进行排序。静态方法Executors.newFixedThreadPool()、Executors.newSingleThreadExecutor()使用了这个队列。此队列的默认长度和最大长度为Integer.MAX_VALUE
(3)SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态。静态方法Executors.newCachedThreadPool()使用了这个队列。
(4)PriorityBlockingQueue:一个具有优先级的无界阻塞队列。
RejectedExecutionHandler:
拒绝策略,当提交任务数超过maxmumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理。Java线程池框架提供4种策略:四种拒绝策略