线程池学习-ThreadPoolExecutor
常用的构造方法:
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime,TimeUnit unit, BlockingQueue workQueue)
参数说明:
corePoolSize --核心线程数
maximumPoolSize --线程池最大允许线程数
keepAliveTime --当线程数大于corePoolSize ,在没有超过指定时间时是不会将空余线程从线程池删除的,如果空闲时间超出指定时间,则删除。
unit --时间单位
workQueue --当线程数大于corePoolSize,存放待执行任务的队列
使用关系具体说明:
1)A代表execute(runnable)欲执行的runnable的数量;
2)B代表corePoolSize;
3)C代表maximumPoolSize;
4)D代表A-B(假设A>=B);
5)E代表new LinkedBlockingDeque();队列,无构造参数;
6)F代表SynchronousQueue队列;
7)G代表keepAliveTime。
1、当A<=B,则任务直接从线程池获取线程,执行任务。队列及超时时间等参数可以忽略。
2、当B<A<=maximumPoolSize,则先执行B的任务,至于多出来的D,根据队列可以分为两种:
2.1 如果队列为E,则将多出的D放在队列,排队等待执行。
2.2 如果队列为F,则多余的D也会立即新建线程去执行,执行完毕后,空闲时间超过指定的时间G后,从线程池中移除。
3、当A>maximumPoolSize,也是分为两种
3.1 如果队列为E,则将多出的D放在队列,排队等待执行。
3.2 如果队列为F,则会执行maximumPoolSize任务,多余任务不再执行,抛出异常。