SpringBoot-基础-07-多线程

使用线程池方式创建多线程

一、为什么使用线程池

1、降低资源消耗:提高线程利用率,降低创建和销毁线程的消耗

2、提高响应速度:任务来了,直接有线程可用可执行,而不是创建线程,再执行

3、提高线程的可管理性:使用线城市可以统一分配调优监控

corePoolSize代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建后并不会消除,而是一种常驻线程。

maxinumPoolSize代表最大线程数,当前任务较多,将核心线程数用光了,但还无法满足需求,就会创建新的线程,但是线程池总线程数不会超过最大线程数。

keepAliveTime、unit表示超出核心线程数之外的线程的空闲空闲存活时间,也就是核心线程不会消除,但是超出核心线程数的部分线程,,超过空闲时间一定会被消除

workQueue用来存放待执行任务,任务队列,核心线程都被使用时,暂不被处理的线程可以被放入任务队列

ThreadFactory实际是一个线程工厂,生产线程,同一个组内,拥有相同优先级,且不是守护线程,可以选择自定义线程工厂。

Handler任务拒绝策略,第一种情况,调用了shutdown方法关闭线程池,第二种情况,已达到最大线程数,拒绝提交新任务。

线程池失效 spring boot springboot线程池满了_线程池


线程池失效 spring boot springboot线程池满了_线程池失效 spring boot_02

二、基本使用

实现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 "";
    }

测试结果:

线程池失效 spring boot springboot线程池满了_线程池失效 spring boot_03