ThreadPoolExecutor构造方法
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.acc = System.getSecurityManager() == null ?
null :
AccessController.getContext();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
Executors中创建线程池的快捷方法,实际上是调用了ThreadPoolExecutor的构造方法(定时任务使用的是ScheduledThreadPoolExecutor),该类构造方法参数列表如下:
corePoolSize: 线程池线程数量(线程池长期维持的线程数,即使线程处于Idle状态,也不会回收)
maximumPoolSize: 线程池支持的最大线程数量(线程数的上限)
keepAliveTime unit : 超过corePoolSize的线程的idle时长,超过这个时间,多余的线程会被回收。
workQueue: 任务的排队队列
threadFactory: 新线程的产生方式
handler: 拒绝策略
有7个参数,new的时候很无奈,比较容易出问题的参数有corePoolSize、maximumPoolSize、workQueue、handler
1、corePoolSize和maximumPoolSize设置不当会影响效率,甚至耗尽线程,发生OOM;
2、workQueue设置不当容易导致OOM;
3、handler设置不当会导致提交任务时抛出异常。
以下是正确的设置方式:
<dt>Queuing</dt>
*
* <dd>Any {@link BlockingQueue} may be used to transfer and hold
* submitted tasks. The use of this queue interacts with pool sizing:
*
* <ul>
*
* <li> If fewer than corePoolSize threads are running, the Executor
* always prefers adding a new thread
* rather than queuing.</li>
*
* <li> If corePoolSize or more threads are running, the Executor
* always prefers queuing a request rather than adding a new
* thread.</li>
*
* <li> If a request cannot be queued, a new thread is created unless
* this would exceed maximumPoolSize, in which case, the task will be
* rejected.</li>
*
* </ul>
*
* There are three general strategies for queuing:
* <ol>
线程池的工作顺序:corePoolSize -> 任务队列 -> maximumPoolSize -> 拒绝策略