美文网首页
SpringBoot 多线性开发

SpringBoot 多线性开发

作者: 丑丑的小怪物 | 来源:发表于2019-11-29 19:10 被阅读0次

    SpringBoot 多线程

    1. 启动类开启多线程支持

    使用 @EnableAsync 来开启 Springboot 对于异步任务的支持

    @SpringBootApplication
    @EnableAsync // 开启多线程
    public class SpringBootApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringBootApplication.class, args);
        }
    }
    

    2. 添加配置类

    1. 配置类实现接口AsyncConfigurator,返回一个ThreadPoolTaskExecutor线程池对象
    2. ThredPoolTaskExcutor的处理流程 :
      1. 当池子大小小于corePoolSize,就新建线程,并处理请求
      2. 当池子大小等于 corePoolSize,把请求放入 workQueue 中,池子里的空闲线程就去workQueue 中取任务并处理
      3. 当 workQueue 放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了 maximumPoolSize,就用 RejectedExecutionHandler 来做拒绝处理
      4. 当池子的线程数大于 corePoolSize 时,多余的线程会等待 keepAliveTime 长时间,如果无请求可处理就自行销毁
    @Configuration
    @EnableAsync
    public class TaskExecutorConfig implements AsyncConfigurer {
    
        @Override
        @Bean
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
            //设置核心线程数
            threadPool.setCorePoolSize(10);
            //设置最大线程数
            threadPool.setMaxPoolSize(100);
            //线程池所使用的缓冲队列
            threadPool.setQueueCapacity(10);
            //等待任务在关机时完成--表明等待所有线程执行完
            threadPool.setWaitForTasksToCompleteOnShutdown(true);
            // 等待时间 (默认为0,此时立即停止),并没等待xx秒后强制停止
            threadPool.setAwaitTerminationSeconds(60);
            //  线程名称前缀
            threadPool.setThreadNamePrefix("Derry-Async-");
            // 初始化线程
            threadPool.initialize();
            return threadPool;
        }
    
        @Override
        public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
            return null;
        }
    }
    

    3. @Async 注解

    通过 @Async 注解表明该方法是异步方法,如果注解在类上,那表明这个类里面的所有方法都是异步的

    @Service
    public class AsyncTaskService {
        @Async
        public void executeAsyncTask(int i) {
            System.out.println("线程" + Thread.currentThread().getName() + " 执行异步任务:" + i);
        }
    }
    
    1. 测试
    @RunWith (SpringRunner.class)
    @SpringBootTest
    public class SpringbootLearnApplicationTests {
     @Autowired
     private AsyncTaskService asyncTaskService;
    
     @Test
     public void threadTest() {
         for (int i = 0; i < 20; i++) {
             asyncTaskService.executeAsyncTask(i);
         }
     }
    
    }
    
    1. 执行结果:
    线程Derry-Async-1 执行异步任务:0
    线程Derry-Async-1 执行异步任务:10
    线程Derry-Async-1 执行异步任务:11
    线程Derry-Async-2 执行异步任务:1
    线程Derry-Async-6 执行异步任务:5
    线程Derry-Async-6 执行异步任务:14
    线程Derry-Async-6 执行异步任务:15
    线程Derry-Async-6 执行异步任务:16
    线程Derry-Async-7 执行异步任务:6
    线程Derry-Async-6 执行异步任务:17
    线程Derry-Async-6 执行异步任务:19
    线程Derry-Async-3 执行异步任务:2
    线程Derry-Async-9 执行异步任务:8
    线程Derry-Async-5 执行异步任务:4
    线程Derry-Async-2 执行异步任务:13
    线程Derry-Async-8 执行异步任务:7
    线程Derry-Async-1 执行异步任务:12
    线程Derry-Async-10 执行异步任务:9
    线程Derry-Async-4 执行异步任务:3
    线程Derry-Async-7 执行异步任务:18
    

    参考博客:CSDN博主「小鹅鹅」

    相关文章

      网友评论

          本文标题:SpringBoot 多线性开发

          本文链接:https://www.haomeiwen.com/subject/skogwctx.html