美文网首页
Spring——@Async

Spring——@Async

作者: 不吃甜食会怎样 | 来源:发表于2019-07-12 18:17 被阅读0次

    1.实现原理

    Spring 通过任务执行器(TaskExecutor)来实现多线程和并发编程

    使用ThreadPoolTaskExecutor实现一个基于线程池的TaskExecutor

    2.使用步骤

    2.1 配置类

    2.1.1使用@EnableAsync开启异步任务支持;

    2.1.2配置类需要实现AsyncConfigure接口并重写getAsyncExecutor和getAsyncUncaughtExceptionHandler方法

    2.2 任务执行类

    通过@Async注解表明这个方法是一个异步方法

    3.demo

    3.1配置类

    @Configuration
    
    @ComponentScan("com.xxx.springboot.springbootdemo")
    
    @EnableAsync
    
    public class TaskExecutorConfig implements AsyncConfigurer {
    
        @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;
    
        }
    
    }
    

    3.2任务执行类

    @Service
    
    public class AsyncTaskService {
    
    @Async
    
        public void executeAsyncTask1(Integer i){
    
    System.out.println(Thread.currentThread().getName()+"执行异步任务1:"+i);
    
        }
    
    @Async
    
        public void executeAsyncTask2(Integer i){
    
    System.out.println(Thread.currentThread().getName()+"执行异步任务2:"+i);
    
        }
    
    }
    

    3.3 执行

    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.executeAsyncTask1(i);
    
            asyncTaskService.executeAsyncTask2(i);
    
          }
    
    context.close();
    
       }
    

    3.4执行结果

    image

    4.设置参数

    Spring 中的ThreadPoolExecutor是借助JDK并发包中的java.util.concurrent.ThreadPoolExecutor来实现的。其中一些值的含义如下:

    int corePoolSize:线程池维护线程的最小数量

    int maximumPoolSize:线程池维护线程的最大数量,线程池中允许的最大线程数,线程池中的当前线程数目不会超过该值。如果队列中任务已满,并且当前线程个数小于maximumPoolSize,那么会创建新的线程来执行任务。

    long keepAliveTime:空闲线程的存活时间TimeUnit unit:时间单位,现由纳秒,微秒,毫秒,秒

    BlockingQueue workQueue:持有等待执行的任务队列

    RejectedExecutionHandler handler 线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施。

    当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭。第二,任务数量超过线程池的最大限制。

    Reject策略预定义有四种:

    (1)ThreadPoolExecutor.AbortPolicy策略,是默认的策略,处理程序遭到拒绝将抛出运行时 RejectedExecutionException。

    (2)ThreadPoolExecutor.CallerRunsPolicy策略 ,调用者的线程会执行该任务,如果执行器已关闭,则丢弃.

    (3)ThreadPoolExecutor.DiscardPolicy策略,不能执行的任务将被丢弃.

    (4)ThreadPoolExecutor.DiscardOldestPolicy策略,如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程).

    【参考】

    《JavaEE开发的颠覆者 SpringBoot实战》

    相关文章

      网友评论

          本文标题:Spring——@Async

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