一. 类结构
1.1 DynamicThreadPoool

Pigeon中的线程池类DynamicThreadPool实现了ThreadPool,ExecutorAware接口
1.2 ThreadPool接口
public interface ThreadPool {
void execute(Runnable run);
<T> Future<T> submit(Callable<T> call);
Future<?> submit(Runnable run);
ThreadPoolExecutor getExecutor();
}
ThreadPool 接口定义了线程池的基本功能,提交runnable 或者callback (runnable callback的区别在于callback允许返回值)
1.3 ExecutorAware
public interface ExecutorAware {
void setCorePoolSize(int corePoolSize);
int getCorePoolSize();
void setMaximumPoolSize(int maximumPoolSize);
int getMaximumPoolSize();
void setWorkQueueCapacity(int workQueueCapacity);
int getWorkQueueCapacity();
}
ExecutorAware是抽象出来,给持有Theadpool的对象提供改动或者查询参数的接口,并且不暴露更多的实现细节
二.成员变量
2.1 name
name是thread的命名前缀,所有的线程都会通过ThreadFactory创建,并保存在ThreadGroup中
2.2 DefaultThreadFactory 线程工厂类,封装了线程池的真正实现,完成了线程池内线程初始化,线程创建。
线程创建过程
public Thread newThread(Runnable r) {
Thread t = new Thread(this.group, r, this.namePrefix + this.threadNumber.getAndIncrement(),
-3715992351445876736L);
t.setDaemon(this.isDaemon);
if (t.getPriority() != 5) {
t.setPriority(5);
}
return t;
}
上述代码几个关键点(通过观察代码注释,daemon 和 线程优先级的调整都是实践的结果,不讨论):
1 将所有线程设置成后台线程(后台线程在所有前台线程销毁的情况下会自动销毁,不会影响资源的回收)
2 将线程优先级定为5(也就是norm)
2.3 ResizableBlockingQueue
ResizableBlockingQueue 就是一个先进先出的工作队列,由于没有随机访问的需求,因此内部采用了链表的实现方式
具体实现可以参见 ResizableLinkedBlockingQueue
2.4 ThreadPoolExecutor
通过持有 blockingQueue工作队列,以及 threadFactory完成工作流程