线程池核心流程和逻辑

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等待超时了

如果不给任务,线程则销毁

以上只是线程池的核心逻辑,还有很多逻辑可以以后继续探讨,比如线程抛异常中止了怎么办,线程池关闭了怎么办等

发布了138 篇原创文章 · 获赞 10 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/idealemail/article/details/104005105