自定义线程池-ThreadPoolTaskExecutor

ThreadPoolExecutor和ThreadPoolTaskExecutor

  1. ThreadPoolExecutor

    1:这个类是JDK中的线程池类,继承自Executor, Executor 顾名思义是专门用来处理多线程相关的一个接口,所有线程相关的类都实现了这个接口,里面有一个execute()方法,用来执行线程,线程池主要提供一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁的额外开销,提高了响应的速度

    
    
    2:ExecutorService为线程池接口,提供了线程池生命周期方法,继承自Executor接口,ThreadPoolExecutor为线程池实现类,提供了线程池的维护操作等相关方法,继承自AbstractExecutorService,AbstractExecutorService实现了ExecutorService接口。
    ```
    
    
    3:当然,我们也可以直接new ThreadPoolExecutor的构造方法来创建线程池,传入需要的参数。
    ```
    
    
  2. ThreadPoolTaskExecutor

    1:这个类则是spring包下的,是sring为我们提供的线程池类,可以使用基于xml配置的方式创建
    
    <!-- spring线程池 -->
        <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
            <!-- 核心线程数  -->
            <property name="corePoolSize" value="10"/>
            <!-- 最大线程数 -->
            <property name="maxPoolSize" value="200"/>
            <!-- 队列最大长度 >=mainExecutor.maxSize -->
            <property name="queueCapacity" value="10"/>
            <!-- 线程池维护线程所允许的空闲时间 -->
            <property name="keepAliveSeconds" value="20"/>
            <!-- 线程池对拒绝任务(无线程可用)的处理策略 -->
            <property name="rejectedExecutionHandler">
                <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy"/>
            </property>
        </bean>
    
    

    然后通过自动注入的方式注入线程池,

    @Resource(name="taskExecutor")
    ThreadPoolTaskExecutor taskExecutor;
    // 或者可以直接@Autowried
    @AutoWired
    ThreadPoolTaskExecutor taskExecutor
    

    或者是通过配置类的方式配置线程池然后注入

    package com.sinosig.sl.sssc.base.threadconfig;
    
    import com.sinosig.sl.sssc.base.threadfactory.AuditThreadFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    import java.util.concurrent.Executor;
    import java.util.concurrent.ThreadFactory;
    import java.util.concurrent.ThreadPoolExecutor;
    
    
    @Configuration
    @EnableAsync
    public class ThreadConfig {
        //Runtime.getRuntime().availableProcessors() 获取CPU的核心数
        public static final int MAXIMUM_POOLSIZE = Runtime.getRuntime().availableProcessors() + 1;
        public static final int CORE_POOLSIZE = Runtime.getRuntime().availableProcessors() / 2 + 1;
        public static final int DEFAULT_CAPACITY = 1000;    //999个四级机构,最多不超过1000
    
    
        @Bean("auditThreadConfig")
        public Executor getAuditThreadConfig() {
            ThreadFactory threadFactory = new AuditThreadFactory("FeePay");
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(CORE_POOLSIZE);//核心线程数
            executor.setMaxPoolSize(MAXIMUM_POOLSIZE);//最大线程数
            executor.setThreadFactory(threadFactory);//线程前缀名称
            executor.setKeepAliveSeconds(30);//线程空闲时间
            executor.setQueueCapacity(DEFAULT_CAPACITY);//队列程度
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());   //采取抛异常拒绝策略
    //        拒绝策略
    //
    //        rejectedExectutionHandler参数字段用于配置绝策略,常用拒绝策略如下
    //
    //        AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException
    //
    //        CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
    //
    //        DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
    //
    //        DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。
    
    
            executor.initialize();
            return executor;
        }
    
    }
    
    
    
    处理流程
    1.查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第二步。
    
    2.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第三步。
    
    3.查看线程池是否已满,即就是是否达到最大线程池数,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。
    
    

在这里插入图片描述

测试方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-brJTix5q-1599703639607)(/Users/renchuanlong/Library/Application Support/typora-user-images/image-20200909182509485.png)]

写一个demo类,标注@Async的方法为异步方法,然后交给spring管理,然后controller  for循环调用这个方法,日志截图:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义线程池可以通过继承ThreadPoolTaskExecutor类来实现。以下是一个示例代码: ```java import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; public class CustomThreadPool extends ThreadPoolTaskExecutor { public CustomThreadPool() { // 设置核心线程数 this.setCorePoolSize(10); // 设置最大线程数 this.setMaxPoolSize(20); // 设置队列容量 this.setQueueCapacity(100); // 设置线程活跃时间(秒) this.setKeepAliveSeconds(60); // 设置线程名称前缀 this.setThreadNamePrefix("CustomThreadPool-"); // 设置拒绝策略 this.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 初始化线程池 this.initialize(); } // 可以在此处添加其他自定义的配置 } ``` 在上述示例中,我们通过继承ThreadPoolTaskExecutor类来创建自定义线程池CustomThreadPool。在构造方法中,我们设置了核心线程数、最大线程数、队列容量、线程活跃时间、线程名称前缀和拒绝策略等属性。 你可以根据自己的需求进行定制化配置,然后通过调用initialize方法来初始化线程池。在自定义线程池类中,你还可以添加其他自定义的配置,以满足具体的业务需求。 使用自定义线程池时,只需将其作为一个Bean注入到Spring容器中,然后在需要使用线程池的地方进行引用即可。例如: ```java @Autowired private CustomThreadPool customThreadPool; ``` 然后可以使用customThreadPool对象来执行异步任务或者多线程操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值