美文网首页
springboot异步任务

springboot异步任务

作者: 一缕清风一世情_百度 | 来源:发表于2020-06-30 10:38 被阅读0次

    启动类--添加@EnableAsync注解

    @SpringBootApplication
    @EnableAsync
    public class MyApplication{
     
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    定义异步任务--添加@Async注解

    @Async注解也可以添加在方法上,代表次方法是异步方法;添加在类上边表示此类下的所有方法都是异步方法。

    使用自定义线程池:括号内填写线程池bean的名称
    @Async("myAsyncTask")
    使用默认线程池:不用加括号
    @Async

    package com.chenglulu.service.async;
    
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.scheduling.annotation.AsyncResult;
    import org.springframework.stereotype.Service;
    
    import java.util.concurrent.Future;
    
    @Service
    @Async("myAsyncTask")
    public class AsyncService {
    
        //获取异步结果
        public Future<String> task1() throws InterruptedException {
            long begin = System.currentTimeMillis();
            Thread.sleep(2000L);
            long end = System.currentTimeMillis();
            System.out.println("任务1耗时="+(end-begin));
            return new AsyncResult<String>("任务1");
        }
    }
    
    

    定义异步线程池

    package com.chenglulu.config;
     
    import java.util.concurrent.ThreadPoolExecutor;
     
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
     
    
    @Configuration
    @EnableAsync
    public class ThreadPoolTaskConfig {
        
        private static final int corePoolSize = 10;               // 核心线程数(默认线程数)线程池创建时候初始化的线程数
        private static final int maxPoolSize = 100;                // 最大线程数 线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
        private static final int keepAliveTime = 10;            // 允许线程空闲时间(单位:默认为秒)当超过了核心线程之外的线程在空闲时间到达之后会被销毁
        private static final int queueCapacity = 200;            // 缓冲队列数 用来缓冲执行任务的队列
        private static final String threadNamePrefix = "Async-Service-"; // 线程池名前缀 方便我们定位处理任务所在的线程池
        
        @Bean("myAsyncTask") // bean的名称,默认为首字母小写的方法名
        public ThreadPoolTaskExecutor myAsyncTask(){
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(corePoolSize);   
            executor.setMaxPoolSize(maxPoolSize);
            executor.setQueueCapacity(queueCapacity);
            executor.setKeepAliveSeconds(keepAliveTime);
            executor.setThreadNamePrefix(threadNamePrefix);
            
            // 线程池对拒绝任务的处理策略 采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            // 初始化
            executor.initialize();
            return executor;
        }
    }
    

    异步任务调用

    @RestController
    @RequestMapping("/api")
    public class MyController {
        
        @Autowired
        private AsyncService asyncService;
        
        @RequestMapping("/test")
        public Boolean testTask() throws InterruptedException{
            
            long begin = System.currentTimeMillis();
            
            Future<String> task1 = asyncService.task1();
            
            /**
             *如果需要监控异步任务是否完成,可以使用以下方式
            **/
            //如果都执行完成就可以跳出循环,isDone方法如果此任务完成,true
            while(true){
                if (task1.isDone()) {
                    break;
                }
            }
            
           
            long end = System.currentTimeMillis();    
            long total = end-begin;
            System.out.println("执行总耗时="+total);
            return true;
        }    
    }
    

    相关文章

      网友评论

          本文标题:springboot异步任务

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