zoukankan      html  css  js  c++  java
  • springboot 的 @Async

    /**
     * Created by zhiqi.shao on 2018/4/3.
     */
    @EnableAsync
    @Configuration
    public 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 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
         */
    
    }
    /**
     * Created by zhiqi.shao on 2018/4/3.
     */
    @Component
    @Slf4j
    public class Task {
    
        public static Random random = new Random();
    
        /**
         * 在定义了线程池之后,我们只需要在 @Async注解中指定线程池名即可,比如:
         * @throws Exception
         */
    
        @Async("taskExecutor")
        public void dotaskOne() throws Exception{
           log.info("任务一开始");
           long start= System.currentTimeMillis();
           Thread.sleep(random.nextInt(10000));
           long end=System.currentTimeMillis();
           log.info("完成任务一耗时:{} 毫秒",(end-start));
        }
    
        @Async("taskExecutor")
        public void dotaskTwo() throws Exception{
            log.info("任务二开始");
            long start= System.currentTimeMillis();
            Thread.sleep(random.nextInt(10000));
            long end=System.currentTimeMillis();
            log.info("完成任务二耗时:{} 毫秒",(end-start));
        }
    
    
        @Async("taskExecutor")
        public void dotaskThree() throws Exception{
            log.info("任务三开始");
            long start= System.currentTimeMillis();
            Thread.sleep(random.nextInt(10000));
            long end=System.currentTimeMillis();
            log.info("完成任务三耗时:{} 毫秒",(end-start));
        }
    /**
     * Created by zhiqi.shao on 2018/4/3.
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes =MytestApplication.class)
    @WebAppConfiguration
    public class TestAsync {
    
        @Autowired
        private Task task;
    
        @Test
        public void test() throws Exception{
            task.dotaskOne();
            task.dotaskTwo();
            task.dotaskThree();
    
            Thread.currentThread().join();
        }
    }
  • 相关阅读:
    基于redis实现的延迟消息队列
    Redis实现求交集操作结果缓存的设计方案
    限流算法之漏桶算法、令牌桶算法
    Apache设置防DDOS模块mod_evasive
    FastCGI技术
    详解强大的SQL注入工具——SQLMAP
    nginx根据域名做http,https分发
    Nginx配置SSL证书部署HTTPS网站
    JProfiler学习笔记
    Mysql压测工具mysqlslap 讲解
  • 原文地址:https://www.cnblogs.com/shaozhiqi/p/8708518.html
Copyright © 2011-2022 走看看