1. 线程池作用:通过复用线程控制线程数量,来节省内存开销,和提高运行速度。
类: ThreadPoolExecutor.java
2. 创建对象时各个参数的含义:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
corePoolSize: 核心线程数量。相当于公司中的在编人员数。
maximumPoolSize: 最大线程数。公司由于业务繁忙,队列排队也排满了,可以扩充一些临时工。公司可以一共雇佣多少人(在编 + 临时工)。
keepAliveTime:闲置线程存活时间。公司由于业务减少,临时工出现空闲。临时工可以留在公司的时间。
unit:设置keepAliveTime的单位
workQueue:工作队列。 如果业务实在繁忙,则加入工作队列,排队处理。
threadFactory: 线程工厂。用于创建线程。相当于公司的人力资源部。
handler:超过队列容量时,处理策略。
在 ThreadPoolExecutor 里面定义了 4 种 handler 策略,分别是
1. CallerRunsPolicy :这个策略重试添加当前的任务,他会自动重复调用 execute() 方法,直到成功。
2. AbortPolicy :对拒绝任务抛弃处理,并且抛出异常。
3. DiscardPolicy :对拒绝任务直接无声抛弃,没有异常信息。
4. DiscardOldestPolicy :对拒绝任务不抛弃,而是抛弃队列里面等待最久的一个线程,然后把拒绝任务加到队列。
线程池执行的逻辑是,增加一个任务加一个worker, 当worker大于核心线程数时,放入队列排队处理,当队列也排满时,使用handler策略处理。
参考:http://blog.csdn.net/abing37/article/details/4506759