zoukankan      html  css  js  c++  java
  • ThreadPoolTaskExecutor和ThreadPoolExecutor

    1、ThreadPoolExecutor

     线程池接口:ExecutorService为线程池接口,提供了线程池生命周期方法,继承自Executor接口,ThreadPoolExecutor为线程池实现类,提供了线程池的维护操作等相关方法,继承自AbstractExecutorService,AbstractExecutorService实现了ExecutorService接口。

    工具类 : Executors

    Executors为线程迟工具类,相当于一个工厂类,用来创建合适的线程池,返回ExecutorService类型的线程池。有如下方法。
    ExecutorService newFixedThreadPool() : 创建固定大小的线程池
    ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。
    ExecutorService newSingleThreadExecutor() : 创建单个线程池。 线程池中只有一个线程

    ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程,可以延迟或定时的执行任务

    其中AbstractExecutorService是他的抽象父类,继承自ExecutorService,ExecutorService 接口扩展Executor接口,增加了生命周期方法。

    2.ThreadPoolTaskExecutor

    这个类则是spring包下的,是sring为我们提供的线程池类,这里重点讲解这个类的用法,可以使用基于xml配置的方式创建

        <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

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

    @Configuration
    public class ExecturConfig {
        @Bean("taskExector")
        public Executor taskExector() {
     
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            int i = Runtime.getRuntime().availableProcessors();//获取到服务器的cpu内核
            executor.setCorePoolSize(5);//核心池大小
            executor.setMaxPoolSize(100);//最大线程数
            executor.setQueueCapacity(1000);//队列程度
            executor.setKeepAliveSeconds(1000);//线程空闲时间
            executor.setThreadNamePrefix("tsak-asyn");//线程前缀名称
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());//配置拒绝策略
            return executor;
        }

    提交任务

    • 无返回值的任务使用execute(Runnable)
    • 有返回值的任务使用submit(Runnable)

    上面注解中已经注释了参数的详解,这里重点讲解一下spring线程池的拒绝策略和处理流程。

        拒绝策略

    rejectedExectutionHandler参数字段用于配置绝策略,常用拒绝策略如下

    AbortPolicy:用于被拒绝任务的处理程序,它将抛出RejectedExecutionException

    CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。

    DiscardOldestPolicy:用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。

    DiscardPolicy:用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。

    其他说明:

    1. 为了实现某些特殊的业务需求,用户可以选择使用自定义策略,只需实现RejectedExecutionHandler接口即可。
    2. 建议配置threadNamePrefix属性,出问题时可以更方便的进行排查。



        处理流程

    1.当一个任务被提交到线程池时,首先查看线程池的核心线程是否都在执行任务,否就选择一条线程执行任务,就是执行第二步。

    2.查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第三步。

    3.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第四步。

    4.查看线程池是否已满,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。

    流程图如下

    监控线程池状态

    常用状态:

        taskCount:线程需要执行的任务个数。
        completedTaskCount:线程池在运行过程中已完成的任务数。
        largestPoolSize:线程池曾经创建过的最大线程数量。
        getPoolSize获取当前线程池的线程数量。
        getActiveCount:获取活动的线程的数量


    参考:ThreadPoolTaskExecutor使用详解

  • 相关阅读:
    反向传播BP算法
    有关一些求导的概念与神经网络梯度下降
    CS224n学习笔记(二)
    CS224n学习笔记(一)
    【模板】动态主席树
    【模板】静态主席树
    【模板】替罪羊树
    【模板】Splay
    洛谷 2387/BZOJ 3669 魔法森林
    洛谷 2622 关灯问题Ⅱ
  • 原文地址:https://www.cnblogs.com/zouhong/p/13206920.html
Copyright © 2011-2022 走看看