Spring系列(五)Spring的多线程

1. 多线程

Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThredPoolTaskExecutor可以实现基于线程池的TaskExecutor。

为了实现异步任务,可以在配置类中通过 @Enable开启对异步任务的支持,并通过实际执行的Bean的方法使用 @Async 注解来声明是一个异步任务

2. 代码示例

  1. 配置类
/**
 *  配置类
 *  @EnableAsync 开启异步任务
 * @author zhaojiaxing
 * @version 1.0
 * @Date 2020/02/14 16:57
 */
@Configuration
@ComponentScan("com.zjx.spring.async")
@EnableAsync
public class TaskExecutorConfig implements AsyncConfigurer {

    /**
     * 重写getAsyncExecutor方法,返回一个ThreadPoolTaskExecutor
     * @return
     */
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(25);
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}
  • @EnableAsync: 开启异步任务支持
  • 配置类实现AsyncConfigurer接口,并重写getAsyncExecutor方法,返回一个ThreadPoolTaskExecutor,这样就获得了一个基于线程池的TaskExecutor。
  1. 任务执行类
@Service
public class AsyncTaskService {

    /**
     *  @Async 注解表明该方法是一个异步方法,如果注解在类上,则表明该类所有方法都是异步方法。
     *  这里的方法自动被注入使用ThreadPoolTaskExecutor作为TaskExecutor
     * @param i
     * @return:
     * @author: zhaojiaxing
     * @createTime: 2020/02/14 17:07
     */
    @Async
    public void executeAsyncTask(Integer i){
        System.out.println("执行异步任务:"+i);
    }

    @Async
    public void executeAsyncTaskPlus(Integer i){
        System.out.println("执行异步任务plus:"+i);
    }
}
  • @Async:注解表明该方法是一个异步方法,如果注解在类上,则表明该类所有方法都是异步方法。自动被注入使用容器中的ThreadPoolTaskExecutor作为TaskExecutor
  1. 运行
public class Main {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(TaskExecutorConfig.class);
        AsyncTaskService asyncTaskService = context.getBean(AsyncTaskService.class);
       for(int i = 0; i < 10;i++){
           asyncTaskService.executeAsyncTask(i);
           asyncTaskService.executeAsyncTaskPlus(i);
       }
        context.close();
    }
}
``

你可能感兴趣的:(Spring系列)