ThreadPoolExecutor
核心参数
- corePoolSize 核心线程数,初始化就生产corePoolSize个线程。此后若线程池数量大于corePoolSize并处于idle状态超过keepAliveTime,则回收这些无用的线程
- maximumPoolSize 最大线程数
- keepAliveTime 可以处于idle的时间
- workQueue(blockingQueue)
- ThreadFactory
- rejectHander 拒绝策略
常用线程池种类
fixed 固定线程数量线程池
corePoolSize = fixedNum
maximumPoolSize = fixedNum
single 单线程池
corePoolSize = 1
maximumPoolSize = 1
cached 缓存线程池
corePoolSize = 0
maximumPoolSize = Integer.MAX_VALUE
拒绝策略
rejectHander 拒绝策略,线程池关闭或线程池中的队列满了,并且线程数大于maximumPoolSize时,对这些任务的处理策略
默认使用AbortPolicy,任务超出时直接抛异常。
DiscardPolicy 什么也不做,直接抛弃
DiscardOldestPolicy 抛弃最老的策略
当然也可以自定义策略
使用Executor创建的线程均使用LinkedBlockingQueue,并且queue的最大容量=Integer.MAX_VALUE,因此无法触发拒绝策略。
shutDown
停止接受任务,执行完当前所有任务后关闭
shutDownNow
丢弃所有任务,直接关闭
submit
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
int c = ctl.get();
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
c = ctl.get();
}
if (isRunning(c) && workQueue.offer(command)) {
int recheck = ctl.get();
if (! isRunning(recheck) && remove(command))
reject(command);
else if (workerCountOf(recheck) == 0)
addWorker(null, false);
}
else if (!addWorker(command, false))
reject(command);
}
- 如果线程数小于corePoolSize则创建一个新线程,并执行这个任务。
- 如果线程数大于或等于corePoolSize则将新任务放入等待队列中。
- 如果队列已满,就尝试创建新的线程来执行这个任务。但若线程数已经大于MaximumPoolSize,则拒绝该任务。(addWorker中判断了线程数)









网友评论