线程池的理解与应用
目录
- 线程池的理解(简单概述)
- Async线程池(加配置)
- Scheduled(加配置)
- 线程池使用的五种配置四种策略
一. 线程池的理解
单体的线程每次请求频繁的创建,请求过后频繁的销毁,导致线程栈中的资源的大量消耗。
线程池的出现在于对单体线程的可控性,管理资源的消耗。
二. Async的线程池
使用异步去配置线程池的话,如图
此时此刻,没有指定Bean的名字,出现一个问题就是启动默认的Async线程池了,并且没有走你自己配置的线程池
走配置的话需要指定Bean名称,让他去覆盖
1 @Bean("taskExecutor") 2 public AsyncTaskExecutor getAsyncE(){ 3 ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 4 executor.setCorePoolSize(coreSize); 5 executor.setMaxPoolSize(maxSize); 6 executor.setQueueCapacity(queueSize); 7 executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); 8 executor.setThreadNamePrefix("MyThread-"); 9 return executor; 10 }
打印如图
三. Scheduled(配置)
不需要指定Bean名称,如果不指定池子的大小默认为1
1 @Bean 2 public ThreadPoolTaskScheduler getTaskScheduled(){ 3 ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); 4 //配置池子的大小 5 taskScheduler.setPoolSize(20); 6 //拒绝策略为 抛出异常 7 taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); 8 //设置名字 9 taskScheduler.setThreadNamePrefix("MyScheduled-"); 10 return taskScheduler; 11 }
四. 线程池的五种配置
- newSingleThreadPoolExecutor
- newFixedThreadPoolExecutor
- newCachedThreadPoolExecutor
- newScheduledThreadPoolExecutor
- ThreadPoolExecutor
底层全是ThreadPoolExecutor,默认策拒绝略都是AbortPolicy,LinkedBlockingQueue=Integer_Max_Value
1. newSingleThreadPoolExecutor –> coreSize=1,maxSize=1
2. newFixedThreadPoolExecutor –> coreSize = maxSize = 固定自己写入 = 5
3. newCachedThreadPoolExecutor –> coreSize = 0,maxSize = Integer_Max_Value
4. newScheduledThreadPoolExecutor –> coreSize 默认为1 ,maxSize = Integer_max_value
5. ThreadPoolExecutor
四种策略
- AbortPolicy –> 拒绝直接抛出异常
- CallerRunsPolicy –> 拒绝策略为谁发来的返回给谁自己做
- DiscardOrdestPolicy –> 丢弃最老的任务,排进去新任务
- DiscardPolicy –> 直接丢弃任务