spring boot使用多线程如此简单,你不考虑在项目中使用一下吗?

千篇一律之线程介绍

大部分介绍线程的技术文档都是cv来的,今天我们来点不一样的

  • 线程池
    自己创建线程,涉及到线程的创建和销毁,太占用资源,没有必要。
    ThreadPoolExecutor 使用该类来创建线程池,关于该类的具体使用这里不过多涉及
  • sping 中的线程池
    spring 中封装了几个定义好的线程池实现(实现了TaskExecutor)
  1. SyncTaskExecutor:在调用者的当前线程同步执行任务
  2. SimpleAsyncTaskExecutor会针对每个任务新建一个线程,运行完线程就停止
  3. ThreadPoolTaskExecutor,最常用的,内部有个线程池,任务扔进去运行就完了

实际使用

  • 线程池整体工作流程(个人理解,有误指正)
  1. 按照CorePoolSize的大小初始化线程,且这些线程不会被销毁
  2. 把多线程的任务放入QueueCapacity里
  3. 当QueueCapacity满了后,按照MaxPoolSize创建新线程,最多不会超过这个设置。而且这些线程会被在setKeepAliveSeconds时间之后被销毁
  4. 当线程打满后就按照RejectedExecutionHandler策略进程拒绝策略,最常用的是CallerRunsPolicy:线程队列满了以后交给调用者执行,一般就是交给主线程来处理。
  • 创建配置类(交给spring管理)

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    import java.util.concurrent.Executor;
    import java.util.concurrent.ThreadPoolExecutor;
    
    /**
     * 多线程配置类
     *
     * @author ActStrady
     * @date 2020/7/30
     */
    @Configuration
    @EnableAsync
    public class AsyncConfiguration {
        /**
         * 多线程配置
         *
         * @return 线程
         */
        @Bean("taskExecutor")
        public Executor asyncExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            // 核心线程数5:线程池创建时候初始化的线程数
            executor.setCorePoolSize(5);
            // 最大线程数5:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
            executor.setMaxPoolSize(10);
            // 缓冲队列500:用来缓冲执行任务的队列
            executor.setQueueCapacity(500);
            // 允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
            executor.setKeepAliveSeconds(60);
            // 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
            executor.setThreadNamePrefix("DailyAsync-");
            // 设置拒绝策略. 替换默认线程池,线程队列满了以后交给调用者执行,也就是同步执行 共四种策略
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            // 等待所有任务结束后再关闭线程池
            executor.setWaitForTasksToCompleteOnShutdown(true);
            executor.initialize();
            return executor;
        }
    }
    
    • @EnableAsync注解用来开启线程池配置
    • 关于几个核心配置的解释
      CorePoolSize:核心线程数量,核心线程不会销毁
      MaxPoolSize:最大线程数量,超过这个就会执行拒绝策略
      QueueCapacity:任务队列,用来缓存任务
      RejectedExecutionHandler:拒绝策略,当线程打满且没有销毁的时候执行的拒绝策略
      拒绝策略种类:
      1. AbortPolicy,默认的处理方式,简单粗暴,丢弃任务并抛出RejectedExecutionException异常
      2. DiscardPolicy:丢弃任务,但是不抛出异常
      3. DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
      4. CallerRunsPolicy:由调用线程处理该任务(一般主线程)一般使用该策略

你可能感兴趣的:(架构之路,Java,git,java,多线程,spring)