1.new一个线程池,线程池7个参数含义:
public ThreadPoolExecutor(int corePoolSize,//核心池大小
int maximumPoolSize,//最大线程数
long keepAliveTime,//空闲时间,大于空闲时间的线程销毁
TimeUnit unit,//时间单位
BlockingQueue<Runnable> workQueue,//阻塞队列,线程数到达核心池大小来新的任务放到这个队列
ThreadFactory threadFactory,//线程工厂
RejectedExecutionHandler handler) //拒绝策略
2.调用execute方法,只列出核心逻辑
1)如果线程数少于corePoolSize,新建Worker
if (workerCountOf(c) < corePoolSize) {
if (addWorker(command, true))
return;
......
}
2)如果线程数大于corePoolSize,往workQueue里放
if (isRunning(c) && workQueue.offer(command))
3)如果往workQueue里放失败了,新建Worker
else if (!addWorker(command, false))
4)新建Worker失败.拒绝
reject(command);
4)addWorker(command, true)方法核心
...
w = new Worker(firstTask);//New Worker
final Thread t = w.thread;
...
t.start();//启动Worker里的线程
...
3.看一下Worker类
1)
private final class Worker
extends AbstractQueuedSynchronizer
implements Runnable
Worker本身实现了Runnable
Worker(Runnable firstTask) {
setState(-1); // inhibit interrupts until runWorker
this.firstTask = firstTask;
this.thread = getThreadFactory().newThread(this);//Worker里的thread放入了Worker对象本身
}
所以2-4步骤里Worker里的线程启动后会调用Worker的run方法
2)Worker的run方法
public void run() {
runWorker(this);
}
3)runWorker(this)方法核心
...
Runnable task = w.firstTask;
...
while (task != null || (task = getTask()) != null) //getTask()是从队列里取任务,这里是一个死循环,一直从队列里拿任务
...
task.run();//执行task的方法,即线程池要执行的真正的任务
...
4.getTask()方法
该方法中会判断是否该给线程一个任务
1.现在线程数是不是大于maximumPoolSize
2.worker等待超时了
如果不给任务,线程则销毁
以上只是线程池的核心逻辑,还有很多逻辑可以以后继续探讨,比如线程抛异常中止了怎么办,线程池关闭了怎么办等