ThreadPoolExecutor
线程池的实现类是ThreadPoolExecutor类,完整的构造方法有7个参数,通过传入不同的参数值可以实现不同功能的线程池。如单个线程的线程池,固定大小的线程池,可缓存无界的线程池,定时线程池等。参数如下:
1.corePoolSize 核心线程池大小,线程池执行任务时,优先会创建线程直到数量为这个值。
2.workQueue 阻塞队列,核心线程池满了后,将会创建线程放入阻塞队列进行等待。对于无界的线程池此阻塞队列是SynchronousQueue类型。
3.keepAliveTime 超时终止时间。超过核心线程池大小时,线程等待执行任务的时间,若超时则终止线程。使线程数量为corePoolSize。
4.unit keepAliveTime 的时间单位
5.maximumPoolSize 线程池最大数量。核心线程池和阻塞队列都满了后,会直接创建一个线程执行任务。如果此时线程总数超过了最大数量则调用handler。
6.threadFactory 创建线程的工厂,所有的任务都通过工厂来创建线程去执行。
7.handler 超出线程池最大数量后执行的处理程序,通常使用拒绝策略。
所有执行任务的线程都放在HashSet<Worker> workers中。还有一个原子类AtomicInteger ctl,ctl记录了"线程池中的任务数量"和"线程池状态"2个信息。ctl共包括32位。其中,高3位表示"线程池状态",低29位表示"线程池中的任务数量"。
Worker
每一个worker包含了一个线程thread(由threadFactory创建,就是woker本身)和要执行的任务firstTask
线程池执行任务的入口是exectue()方法,通过ctl判断当前线程池状态后,来新增worker去执行任务还是添加到阻塞队列。首先设置firstTask为要执行的任务Runnable,然后把当前worker创建为一个线程thread。启动线程
从而执行worker中的run方法,从而执行runworker方法,最终会调用firstTask的run()。
Worker继承了AQS,在执行任务时lock()加上独占锁保证线程安全。