线程池Executor框架简介及选型

目录

一、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]

    欢迎转载,转载请注明出处,谢谢。

猜你喜欢

转载自blog.csdn.net/laoxilaoxi_/article/details/81023735