定义线程池 & 开启异步可用

在springboot中实现异步线程池非常简单,首先我们了解一下springAsyncConfigure 接口。

  1. package org.springframework.scheduling.annotation;
  2. public interface AsyncConfigurer {
  3. //获取线程池
  4. @Nullable
  5. default Executor getAsyncExecutor() {
  6. return null;
  7. }
  8. //异步异常处理器
  9. @Nullable
  10. default AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
  11. return null;
  12. }
  13. }
  • getAsyncExecutor()返回一个自定义的异步线程池,这样开启异步,线程池会提供空闲线程来执行异步任务。
  • getAsyncUncaughtExceptionHandler() 因为业务逻辑可能抛出异常,所以此方法是一个处理异常的处理器。

实例

配置类

  1. @Configuration
  2. @EnableAsync
  3. public class AsyncConfig implements AsyncConfigurer{
  4. @Override
  5. public Executor getAsyncExecutor() {
  6. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  7. executor.setCorePoolSize(5);
  8. executor.setMaxPoolSize(30);
  9. executor.setQueueCapacity(1000);
  10. executor.initialize();
  11. return executor;
  12. }
  13. @Override
  14. public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
  15. System.out.println("异常处理");
  16. return null;
  17. }
  18. }
  • @EnableAsync 开启异步,这样就可以使用@Async注解驱动了
  • 实现AsyncConfigurer接口,覆盖getAsyncExecutor()方法,这样就是实现了自定义线程池,当方法被@Async标注时,Spring就会通过这个线程池的空闲线程去运行该方法。

    使用方式

  1. @Component
  2. public class AsyncClass {
  3. @Async
  4. public void run() {
  5. for (int i=0;i<10;i++){
  6. if ( Thread.currentThread().isInterrupted() ) {
  7. System.out.println("i have interputed");
  8. }
  9. System.out.println("i:"+i);
  10. try {
  11. TimeUnit.SECONDS.sleep(1);
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. }
  16. }
  17. }
  • 使用@Async标识改方法是异步执行