四种常见内置线程池:
1. 缓存池
- newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
2. 定长池
- newFixedThreadPool可以创建一个定长的线程池。定长线程池最多只能同时执行一定个数的线程,这个容量在new的时候设定。
3. 定时池
- newScheduledThreadPool创建一个定时线程池,支持延迟执行和周期性任务执行。后一种执行方式类似于单片机的定时器中断。
4. 单线程线程池
- newSingleThreadExecutor创建一个单线程化的线程池,这个线程池当前池中的线程死后(或发生异常时),才能重新启动新的一个线程来替代原来的线程继续执行下去。也就是说按照单线程的模式,会按照线程添加的顺序,一个一个的执行这些线程的工作。
线程池考点:三大方法、7大参数、4种拒绝策略
池化技术:事先准备好资源,有人要用就来我这拿,用完之后还给我
默认大小:2
max:
线程池的好处:
1、降低资源消耗
2、提高响应效率
3、方便管理线程
线程服用、可以控制并发数
理解:(线程池有核心线程数、最大线程数、和阻塞队列构成)
1、当线程需求小于核心线程数+阻塞队列大小时,只会有核心线程开
2、当线程需求介于最大线程数+阻塞队列大小时,会逐步开启所有线程
3、当线程需求大于最大线程数+阻塞队列大小时,会执行拒绝策略
线程安排优先级:核心线程数>阻塞队列>最大线程数
三大方法:
七大参数:
1.corePoolSize:线程池中的常驻核心线程数
2.maxinumPoolSize:线程池中能够容纳同时执行的最大线程数,此值必须大于等于一
3.keepAliveTime:多余的空闲线程的存活时间。
当前线程池数量超过corePoolSize时,当空闲时间达到keepAliveTime时,多余空闲线程会被销毁直到只剩下corePoolSize个线程为止。
4.unit:keepAliveTime的单位
5.workQueue:任务队列,被提交但是尚未被执行的任务。
6.threadFactory:表示生成线程池中工作线程的线程工厂,用于创建线程一般用默认的即可。
7.handler:拒绝策略,表示当队列满了并且工作线程-大于等于线程池的数量最大线程数(maxinumPoolSize)时如何来拒绝请求执行的runnable的策略。
所以一般实际运用中药用源码的方式去自定义线程池
四种拒绝策略
最大线程数如何设置?
分为CPU密集型和IO密集型
CPU密集型:设置CPU核数为最大线程数 N+1
IO密集型:程序有15个大型任务,IO特别占用资源,一般设置为大型任务数的二倍 2N