Spring Boot使用@Async实现异步调用:自定义线程池

作者:网友投稿 时间:2018-06-22 01:35

字号
技术沙龙 | 6月30日与多位专家探讨技术高速发展下如何应对运维新挑战!

本文中的例子我们可以在之前的例子基础上修改,也可以创建一个全新的Spring Boot项目来尝试。

Spring Boot使用@Async实现异步调用:自定义线程池

定义线程池

第一步,先在Spring Boot主类中定义一个线程池,比如:

@SpringBootApplication 

public class Application { 

 

    public static void main(String[] args) { 

        SpringApplication.run(Application.class, args); 

    } 

 

    @EnableAsync 

    @Configuration 

    class TaskPoolConfig { 

 

        @Bean("taskExecutor"

        public Executor taskExecutor() { 

            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 

            executor.setCorePoolSize(10); 

            executor.setMaxPoolSize(20); 

            executor.setQueueCapacity(200); 

            executor.setKeepAliveSeconds(60); 

            executor.setThreadNamePrefix("taskExecutor-"); 

            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); 

            return executor; 

        } 

    } 

 

上面我们通过使用ThreadPoolTaskExecutor创建了一个线程池,同时设置了以下这些参数:

核心线程数10:线程池创建时候初始化的线程数

最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程

缓冲队列200:用来缓冲执行任务的队列

允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁

线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池

线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务

使用线程池

在定义了线程池之后,我们如何让异步调用的执行任务使用这个线程池中的资源来运行呢?方法非常简单,我们只需要在@Async注解中指定线程池名即可,比如:

@Slf4j 

@Component 

public class Task { 

 

    public static Random random = new Random(); 

 

    @Async("taskExecutor"

    public void doTaskOne() throws Exception { 

        log.info("开始做任务一"); 

        long start = System.currentTimeMillis(); 

        Thread.sleep(random.nextInt(10000)); 

        long end = System.currentTimeMillis(); 

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接