本文中主要对ThreadPoolExecutor讲解
线程池的构造参数
1、corePoolSize:核心线程数
2、maximumPoolSize:最大线程数
3、keepAliveTime:额外的线程的存活时间
4、workQueue:工作队列,阻塞队列
5、threadFactory:线程工厂,可指定线程名字
6、rejectedhandler:拒绝策略
线程池的关键方法
1、public void execute(Runnable command):提交任务到线程池
2、public Future<?> submit(Runnable task):可异步返回的方式提交任务到线程池
3、private boolean addWorker(Runnable firstTask, boolean core) :创建worker,即新建线程工作者,里面包装了Thread
4、final void runWorker(Worker w):worker线程启动时,执行的真正方法,可消费队列中的任务
5、private Runnable getTask():获取队列中的任务,注意poll和take的区别
线程池的执行原理概述
围绕线程池的主要参数和主要方法,总结线程池的执行过程如下:
1、提交任务后,先判断当前池中线程数是否小于corePoolSize,如果小于,则创建新线程执行这个任务。
2、如果大于corePoolSize,则判断等待队列是否已满,如果没有满,则添加到等待队列。
3、如果队列已满,判断当前池中线程数是否大于 maximumPoolSize,如果小于,则可以创建新线程执行任务。如果大于,则不再创建新线程。如果大于则拒绝。
4、否则,创建一个新的线程执行这个任务。
5、getTask方法中,核心线程使用take方式从队列中获取任务,在不设置 allowCoreThreadTimeOut的情况下,将一直
阻塞,不会被回收。
6、非核心线程使用poll的方式从队列中获取任务,经过keepAliveTime后,还没有拿到任务,则非核心线程结束阻塞,
资源将被回收。