首页 > 其他分享 >ThreadPoolTaskExecutor自定义线程池的配置和使用

ThreadPoolTaskExecutor自定义线程池的配置和使用

时间:2023-07-16 21:23:28浏览次数:48  
标签:异步 自定义 队列 线程 executor ThreadPoolTaskExecutor

ThreadPoolTaskExecutor自定义线程池的配置和使用
  • 线程池ThreadPoolTaskExecutor和ThreadPoolExecutor的区别

    • ThreadPoolExecutor,这个类是JDK中的线程池类,继承自Executor,里面有一个execute()方法,用来执行线程,线程池主要提供一个线程队列,队列中保存着所有等待状态的线程,避免了创建与销毁的额外开销
  • ThreadPoolTaskExecutor,是Spring提供的线程池类

    • Spring异步线程池的接口类是TaskExecutor,本质还是java.util.concurrent.Executor
  • 准备工作

    • 启动类添加@EnableAsync

    • 需要异步的方法添加@Async("[线程池名]")

  • 自定义线程池

    /**
     * 自定义线程池
     * corePoolSize:当线程数小于corePoolSize个的时候,正常创建线程
     *
     * queueCapacity:当线程大于corePoolSize个的时候,将线程放入queueCapacity大小的队列
     *
     * maxPoolSize:当queueCapacity队列已满,将会继续创建线程,直到线程数超过maxPoolSize的大小,将抛出异常
     */
    @Configuration
    @EnableAsync
    public class ThreadPoolTaskConfig {
    	// 连接池名
        @Bean("threadPoolTaskExecutor")
        public ThreadPoolTaskExecutor threadPoolTaskExecutor(){
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            //线程池创建的核心线程数,线程池维护线程的最少数量,即使没有任务需要执行,也会一直存活
            //如果设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭
            executor.setCorePoolSize(16);
    
            //队列容量(队列只存在任务,不存在线程)
            executor.setQueueCapacity(1024);
    
            //最大线程数;
            //当corePoolSize 以及queueCapacity 满了以后,会在线程中额外创建线程.最大线程数指的是当前存在的最大的线程数。队列中的不属于
            executor.setMaxPoolSize(64);
    
            //当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize
            //如果allowCoreThreadTimeout=true,则会直到线程数量=0
            executor.setKeepAliveSeconds(30);
            //优雅关闭
            executor.setWaitForTasksToCompleteOnShutdown(true);
    
            //线程名前缀
            executor.setThreadNamePrefix("自定义线程池-");
    
    
            //当线程数满MaxPoolSize时,可采用以下拒绝策略
            
            //CallerRunsPolicy():交由调用方线程运行,比如 main 线程;如果添加到线程池失败,那么主线程会自己去执行该任务,不会等待线程池中的线程去执行
            //AbortPolicy():该策略是线程池的默认策略,如果线程池队列满了丢掉这个任务并且抛出RejectedExecutionException异常。
            //DiscardPolicy():如果线程池队列满了,会直接丢掉这个任务并且不会有任何异常
            //DiscardOldestPolicy():丢弃队列中最老的任务,队列满了,会将最早进入队列的任务删掉腾出空间,再尝试加入队列
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
    
            executor.initialize();
            return executor;
        }
    
    }
    
  • 连接线程池测试

    • 异步方法test (该类需要注入IOC容器中)
    @Component
    @Slf4j
    public class TestComponent {
        @Autowired
        private RestTemplate restTemplate;
        
        @Async("threadPoolTaskExecutor")
        public void test(){
    
               long beginTime = CommonUtil.getCurrentTimestamp();
            ResponseEntity<String> forEntity = restTemplate.getForEntity("https://www.baidu.com/", String.class);
            String body = forEntity.getBody();
            long endTime = CommonUtil.getCurrentTimestamp();
            log.info("耗时={},body={}",endTime-beginTime,body);
        }
    }
    
    • 调用异步方法进行测试(测试接口与异步方法不能在同一个类中)
    @RestController
    @RequestMapping("/api")
    public class NotifyController {
    
        @Autowired
        private TestComponent testComponent;
        /**
         * 测试异步方法
         * @return
         */
        @RequestMapping("/test")
        public JsonData sendCode(){
        	testComponent.test();
            return JsonData.buildSuccess();
        }
    }
    

标签:异步,自定义,队列,线程,executor,ThreadPoolTaskExecutor
From: https://www.cnblogs.com/xietingwei/p/17558597.html

相关文章

  • 什么是进程和线程? 为什么要引入线程? 进程和线程的区别?
    什么是进程和线程?为什么要引入线程?进程和线程的区别? 什么是进程和线程?什么是进程?进程是程序在某个数据集合上的一次运行活动(不仅包含正在运行的程序实体,并且包括这个运行的程序中占据的所有系统资源,比如说CPU、内存、网络资源等),也是操作系统进行资源分配和保护的基......
  • spring boot 接口多线程
    SpringBoot接口多线程在单线程的环境中,当接口请求过多时,容易造成阻塞和性能问题。为了提高系统的响应速度和吞吐量,我们可以使用多线程来处理接口请求。本文将介绍如何在SpringBoot中使用多线程处理接口请求,并给出相应的代码示例。什么是多线程多线程是指在一个进程中同时执行......
  • Java-多线程-八股文
    线程安全的理解?线程安全说的是,当多个线程并发访问互斥资源时,读写互斥资源的代码逻辑能正常处理,获得正确结果,不会互相干扰的情况。守护线程的理解?守护线程是与普通线程相区分的概念,用户一般使用的就是普通线程,普通线程有自身独立的生命周期,而守护线程的生命周期取决于普通......
  • 自定义java@注解
    自定义注解主要用于抽象出重复代码,以减少枯燥无味的重复工作量举例:创建Redis分布式锁注解步骤:新建interface接口@Target(ElementType.METHOD)//描述注解使用范围@Retention(RetentionPolicy.RUNTIME)//设置注解时间范围//SOURCE源文件保留//CLASS,......
  • SpringBoot中通过自定义Jackson注解实现接口返回数据脱敏
    场景SpringBoot中整合ShardingSphere实现数据加解密/数据脱敏/数据库密文,查询明文:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/131742091上面讲的是数据库中存储密文,查询时使用明文的脱敏方式,如果是需要数据库中存储明文,而在查询时返回处理后的数据,比如身份......
  • 开发自己的Prometheus Exporter、实现自定义指标
    PrometheusExporter基础知识PrometheusExporter的概念、工作原理 PrometheusExporter是一个用来收集和暴露指标数据的工具,通过与Prometheus监控系统一起使用。它的结构包括两个组件:Collector和Exporter:Collector:用于从目标应用程序或系统收集指标并将其转化为Prometheus......
  • Winform自定义控件之复合控件
    winform提供了很多控件供使用,如label;text;button;panel;checkbox等,在一些场景下,这些控件不能很好的满足使用或适应场景,就需要我们进行自定义控件。自定义控件有三种形式:1.组合控件:将vs提供的控件自定义组合打包成一个新的控件就叫做组合控件。可避免一些重复工作代码,这个很好理......
  • Python的多线程(threading)与多进程(multiprocessing )
    可以用来做后台任务,可以在djangoview中调用,当做异步任务考核系统中要的threading,用来异步考核结果和考核进度的统计Python的多线程(threading)与多进程(multiprocessing)......
  • JAVA----线程池
    线程池线程的状态:1新建状态(没启动)2可运行状态(可能在运行,也可能等待cpu时间片)3阻塞(等待获取排他锁,或者等待其他线程唤醒,不醒无法获取时间片)4限期等待(一段时间后被系统自动唤醒)5死亡:可能任务执行结束或产生异常结束。线程池的状态:RUNNING:运行状态,可以接受新任务......
  • 线程安全 与 非线程安全
    线程安全:多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 非线程安全:在运行中不提供数据访问保护,这就可能导致多个线程先后更改数据,最后所得的数据......