zoukankan      html  css  js  c++  java
  • spring-boot自定义线程池

    • 在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());
                executor.setWaitForTasksToCompleteOnShutdown(true);
                executor.setAwaitTerminationSeconds(60);
                return executor;
            }
        }
    }
    

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

    • 核心线程数10:线程池创建时初始化的线程数
    • 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
    • 缓冲队列200:用来缓冲执行任务的队列
    • 允许线程的空闲时间60秒:超过了核心线程数之外的线程,在空闲时间到达之后会被销毁
    • 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
    • 线程池对拒绝任务的处理策略:此处采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在execute方法的调用线程中运行被拒绝的任务;如果执行程序已被关闭,则会丢弃该任务
    • 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
    • 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
    使用线程池
    • 只需要在@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();
            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) + "毫秒");
        }
    }
    
    • 测试
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    public class ApplicationTests {
    
        @Autowired
        private Task task;
    
        @Test
        public void test() throws Exception {
    
            task.doTaskOne();
            task.doTaskTwo();
            task.doTaskThree();
            Thread.currentThread().join();
        }
    }


    作者:Dear_diary
    链接:https://www.jianshu.com/p/a13ac0d774c6
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    解决 搭建Jekins过程中 启动Tomcat的java.net.UnknownHostException异常
    射手和农场主
    java 和 JS(javaScript)中的反斜杠正则转义
    分享修改密码的SharePoint Web part: ITaCS Change Password web part
    分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机
    Office 365 的公共网站的一些限制及解决的办法
    SharePoint 2013 关闭 customErrors
    安装 KB2844286 导致SharePoint 2010 XSLT web part 显示出现错误
    安装Office Web Apps Server 2013 – KB2592525安装失败
    如何将hyper-v虚拟机转换成vmware的虚拟机- 转换SharePoint 2010 Information Worker Demonstration and Evaluation Virtual Machine (SP1)
  • 原文地址:https://www.cnblogs.com/zeenzhou/p/12664154.html
Copyright © 2011-2022 走看看