SpringBoot-基础-07-多线程
使用线程池方式创建多线程
一、为什么使用线程池
1、降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗
2、提高响应速度:任务来了,直接有线程可用可执行,而不是创建线程,再执行
3、提高线程的可管理性:使用线城市可以统一分配调优监控
corePoolSize代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后并不会消除,而是一种常驻线程。
maxinumPoolSize代表最大线程数,当前任务较多,将核心线程数用光了,但还无法满足需求,就会创建新的线程,但是线程池总线程数不会超过最大线程数。
keepAliveTime、unit表示超出核心线程数之外的线程的空闲空闲存活时间,也就是核心线程不会消除,但是超出核心线程数的部分线程,,超过空闲时间一定会被消除
workQueue用来存放待执行任务,任务队列,核心线程都被使用时,暂不被处理的线程可以被放入任务队列
ThreadFactory实际是一个线程工厂,生产线程,同一个组内,拥有相同优先级,且不是守护线程,可以选择自定义线程工厂。
Handler任务拒绝策略,第一种情况,调用了shutdown方法关闭线程池,第二种情况,已达到最大线程数,拒绝提交新任务。
二、基本使用
实现AsyncConfigurer配置线程池,具有异常处理,通过实现类里的getAsyncExecutor()中创建线程池,方法中必须执行theadPool.initialize方法进行初始化
示例:
配置线程池
@Component
@EnableAsync
public class TestConfig implements AsyncConfigurer {
//创建线程池,配置线程核心线程数、最大线程数、缓冲队列的任务数量
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
threadPool.setCorePoolSize(2);//当前线程数
threadPool.setMaxPoolSize(120);// 最大线程数
threadPool.setQueueCapacity(1);//线程池所使用的缓冲队列
threadPool.initialize(); // 初始化
System.out.println("--------------------------》》》开启异常线程池");
return threadPool;
}
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new MyAsyncExceptionHandler();
}
//异常处理类
class MyAsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
//手动处理捕获的异常
@Override
public void handleUncaughtException(Throwable throwable, Method method, Object... obj) {
System.out.println("-------------》》》捕获线程异常信息");
}
}
}
public interface DemoService {
void asyncTask1(Integer i);
}
服务层
@Service
public class DemoServiceImpl implements DemoService {
@Async
@Override
public void asyncTask1(Integer i){
try{
Thread.sleep(1000);
System.out.println("执行异步任务A:"+i);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
控制层
@ResponseBody
@RequestMapping("/test1")
public String testPool(){
for(int i=1;i<30;i++){
demoService.asyncTask1(i);
}
return "";
}
测试结果: