9. Java中的线程池

2020-02-13  本文已影响0人  星冉子

使用线程池的好处

降低资源消耗:重复利用线程,降低创建和销毁的消耗;

提高响应速度:任务到达时可马上执行,不需要等待线程创建;

提高线程的可管理型:统一分配、调优、监控线程资源;

线程池实现原理

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在任务执行前后执行其他动作,如统计线程运行时间;

上一篇 下一篇

猜你喜欢

热点阅读