使用线程池的好处
降低资源消耗:重复利用线程,降低创建和销毁的消耗;
提高响应速度:任务到达时可马上执行,不需要等待线程创建;
提高线程的可管理型:统一分配、调优、监控线程资源;
线程池实现原理
ThreadPoolExecutor提交新任务时的处理流程:
1. 判断核心线程池是否已满,否则创建线程执行任务,是则进入下一步;(即使核心线程池有空闲线程,如果未满也会创建新线程)
2. 判断任务队列是否已满,否则将任务加入队列,是则进入下一步;(若使用无界队列则此步无意义,始终未满)
3. 判断整个线程池是否已满,否则创建线程执行任务,是则按照饱和策略处理;(可能先添加的任务在队列中排队,而后面的任务先执行)
提交到线程池的任务会封装成工作线程,循环获取任务执行;
创建线程池
创建线程池的参数:
corePoolSize:核心线程数量;
runnableTaskQueue:任务队列,阻塞队列;
maximumPoolSize:线程池最大数量;包含核心线程数;
ThreadFactory:线程创建工厂,可统一命名;
rejectedExecutionHandler:队列和线程池都满时的处理策略,包括抛异常、原线程中运行、丢弃队列中的最后一个任务执行、不处理丢弃;
keepAliveTime:工作线程空闲后的存活时间;
向线程池提交任务
2种方式:execute:用于提交不需要返回值的任务;submit:用于提交需要有返回值的任务;
关闭线程池
shutdown:遍历所有线程调用线程的中断方法,无法响应中断的线程永远无法停止,线程池状态置为SHUTDOWN,isShutDown返回true;
shutdownNow:尝试停止所有线程,返回等待执行的线程,线程池状态置为STOP,isShutDown返回true;
当所有任务都关闭后,线程池才关闭成功,此时isTerminaed才返回true;
合理配置线程池
考虑已下方面:
1. 任务性质:CPU密集(配置少量线程Cpu个数+1)、IO密集(设置多数线程2*Cpu个数)、混合型任务;
2. 任务优先级:高中低,可使用优先队列处理;
3. 任务执行时间:长中短,可由不同规模的线程池分开处理,或者使用优先队列,时间短的优先;
4. 任务依赖性:如系统资源或数据库连接,应该设置多的线程,提高CPU利用率;
线程池监控
通过API获取线程池任务信息:已完成任务数、曾经创建过的最大线程数(可判断曾经是否满过)、线程池数量(不销毁只增不减)、活动线程数、需要执行的任务数;
通过覆写方法:beforeExecute、afterExecute、terminated在任务执行前后执行其他动作,如统计线程运行时间;
网友评论