线程池Executor框架简介及选型
目录
一、Executor简介
1.Executor构成(可了解也可不了解)
Executor由三部分构成,任务、任务执行、异步结果。
任务:任务实现了Runnable或者Callable
任务执行:接口有Executor、ExecutorService,实现类ThreadPoolExecutor与ScheduledThreadPoolExecutor
异步结果:接口Future,实现类FutureTask
类图:
2.Executor成员之ThreadPoolExecutor
ThreadPoolExecutor一般通过Executors工厂创建
1》FixedThreadPool 固定线程数线程池,适用于负载比较重的服务器
2》SingleThreadExecutor 单个线程
3》CacheThreadPool 缓冲线程池(线程池大小无界),适用于负载比较轻的服务器
一般新手都是用Executors工厂创建,但是不建议这么创建,因为其中很多东西都是默认的,并不一定适合我们所需要的场景,建议使用ThreadPoolExecutor的构造方法去创建线程池。
ThreadPoolExecutor构造方法参数如下:
corePool:核心线程池大小,当当先线程数小于corePool时,会为新任务创建线程,超过corePool后会把新任务放入BlockingQueue队列;当线程多余corePool时,且存在空闲,会回收空闲线程
maxinumPool:最大线程池大小,线程池可创建的最大工作线程
BlockingQueue:暂时保存任务的工作队列
RejectedExecutionHandler:当线程池关闭或者饱和时,溢出任务处理调用该方法
keepAliveTime:当超出corePool的线程空闲时,等待keepAliveTime时间后回收
3.Executor成员之ScheduledThreadPoolExecutor
周期任务线程池,可用过Executors工厂创建
二、线程池的合理使用
线程池使用恰当的话
1》可以降低资源消耗(降低线程创建销毁所需开销)
2》可以提高响应速度(不需要等待线程创建就可立即执行、异步)
3》线程可控,提高系统稳定(一般一个系统能创建的线程数有限,内存也是有限的)
一般配置线程池可通过几方面考虑:
1》任务是CPU密集还是IO密集还是混合(一般跑起来任务去看TOP就可以看出来,虽然比较LOW,度娘又很多方式查看,开发人员一般根据代码逻辑就可分析出来)
2》执行时间:快、慢
1.CPU密集型一般分配 CPU核数+1个线程,IO密集型的则一般分配2*CPU核数(因为IO密集的任务很多时候CPU是空闲的),混合任务的那就拆分成IO密集与CPU密集(一般两个执行时间相差不会很大,太大的话就不用拆了,因为快的一直等慢的也快不了)
2.执行时间长短看具体情况,如果执行的时间长是因为远程调用或者连接数据库执行SQL,那么一般设置大一些,因为大部分时间是消耗在网络以及远程服务上,CPU大部分时间空闲,如果时间长都是因为本地执行慢,那就依据CPU密集还是IO密集区做判断(其实归根结底还是CPU密集与IO密集去判断)
以上为本人一些粗浅的看法,如有错误或者不恰当处,还望海涵,帮忙指出,也欢迎留言讨论,邮箱地址[email protected]
欢迎转载,转载请注明出处,谢谢。