美文网首页
Spring boot使用注解@Async实现异步调用

Spring boot使用注解@Async实现异步调用

作者: 离别刀 | 来源:发表于2018-06-08 13:40 被阅读0次
    0608142600.png

    1.自定义线程池

    @EnableAsync
    @Configuration
    public class BeanConfig {
        @Bean("taskExecutor")
        public Executor initTaskExecutor(){
            ThreadPoolTaskExecutor executor= new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(5);
            executor.setMaxPoolSize(20);
            executor.setQueueCapacity(200);
            executor.setThreadNamePrefix("taskExecutor-");
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return executor;
        }
    }
    

    上面我们通过使用 ThreadPoolTaskExecutor创建了一个线程池,同时设置了以下这些参数:
    ◾核心线程数10:线程池创建时候初始化的线程数
    ◾最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
    ◾缓冲队列200:用来缓冲执行任务的队列
    ◾允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
    ◾线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
    ◾线程池对拒绝任务的处理策略:这里采用了 CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务

    2.定义任务执行类ExecutorTaskService

    @Service
    public class ExecutorTaskService {
    
        @Async("taskExecutor")
        public void doTask1() throws InterruptedException {
            System.out.println("开始做任务一");
            long start = System.currentTimeMillis();
            Thread.sleep(2000);
            long end = System.currentTimeMillis();
            System.out.println("完成任务一,耗时:" + (end - start) + "毫秒");
        }
    
        @Async("taskExecutor")
        public void doTask2() throws InterruptedException {
            System.out.println("开始做任务二");
            long start = System.currentTimeMillis();
            Thread.sleep(1000);
            long end = System.currentTimeMillis();
            System.out.println("完成任务二,耗时:" + (end - start) + "毫秒");
        }
    
        @Async("taskExecutor")
        public void doTask3() throws InterruptedException {
            System.out.println("开始做任务三");
            long start = System.currentTimeMillis();
            Thread.sleep(500);
            long end = System.currentTimeMillis();
            System.out.println("完成任务三,耗时:" + (end - start) + "毫秒");
        }
    }
    

    3.定义controller

    @RequestMapping("/executor")
    @Controller
    public class ExecutorTaskCtrl {
    
        @Autowired
        private ExecutorTaskService executorTaskService;
    
        @RequestMapping(value = "/doTask",method = RequestMethod.GET)
        @ResponseBody
        public void doTask() throws InterruptedException {
            executorTaskService.doTask1();
            executorTaskService.doTask2();
            executorTaskService.doTask3();
        }
    }
    

    访问http://localhost:9999/executor/doTask 查看打印结果:
    开始做任务二
    开始做任务一
    开始做任务三
    完成任务三,耗时:501毫秒
    完成任务二,耗时:1001毫秒
    完成任务一,耗时:2001毫秒

    参考原创: 翟永超

    相关文章

      网友评论

          本文标题:Spring boot使用注解@Async实现异步调用

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