线程池:
作用:
1、利用线程池管理并复用线程、控制最大并发数等。(减少频繁创建和销毁线程带来的性能开销)
2、实现任务线程队列缓存策略和拒绝机制(拒绝机制用于拒绝一次性过多的线程,导致系统资源不足,引起其他服务也崩溃)
3、实现某些与时间相关的功能,如定时执行、周期执行(有一些时间控制的线程池)
4、隔离线程环境。(为不同服务开启独立配置的线程池,可以防止服务速度不同带来的影响)
优点:
1、降低资源消耗
2、提高响应速度
3、提高线程的可管理性
常用参数分析:
1、corePoolSIze:常驻核心线程数,如果为0,没有线程请求时会销毁线程池里的所有线程,如果大于0,则没有线程请求时,里面的核心线程也不会被销毁。这个数目要控制好,过大会浪费资源,过小会导致频繁创建销毁线程带来性能下降
2、maximumPoolSize:标识线程池支持的最大线程数。如果跟核心线程一致,则线程池为固定线程数的线程池
3、keepAliveTime:标识线程池的线程空闲时间,大于核心线程数的空闲线程在超过keepAliveTime后,会被销毁,直至剩下常驻核心线程数,避免浪费内存和句柄资源; 当ThreadPoolExecutor 的 allowCoreThreadTimeOut为true时,核心线程也能被回收。
4、TimeUnit:表示时间单位,keepAliveTime时间单位通常是:TimeUnit.SECONDS。
5、workQueue:表示缓存队列,请求数大于corePoolSize时,线程进入缓存队列。
6、threadFactory:表示线程工厂。用来生成一组相同任务的线程。线程池的命名是通过给这个factory增加组名前缀来实现的。
7、handler:表示执行拒绝策略的对象。当workQueue任务缓存队列达到上限后,而且活动线程数大于maximumPoolSize时,线程池会通过拒绝策略处理请求。友好的拒绝策略有以下三种:
(1)保存到数据库进行削峰填谷。在空闲时间再提取出来
(2)转向某个提示页面
(3)打印日志
Executor框架
两级调度模型:
因为Java线程和操作系统线程是一对一映射的。因此在Java线程启动的时候会创建一个本地操作系统线程,终止时,操作系统就会回收这个线程。在上层,多线程程序常常把应用分解成若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;在下层,操作系统内核将这些线程映射到硬件处理器上。
它是一个接口,将任务提交和执行分离