美文网首页
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