一、简介
ThreadPoolTaskExecutor线程是Spring的线程池,其底层是依据JDK线程池ThreadPoolExecutor来实现的。
二、参数介绍
corePoolSize:线程池维护线程最小的数量,默认为1
maxPoolSize:线程池维护线程最大数量,默认为Integer.MAX_VALUE
keepAliveSeconds:(maxPoolSize-corePoolSize)部分线程空闲最大存活时间,默认存活时间是60s
queueCapacity:阻塞任务队列的大小,默认为Integer.MAX_VALUE,默认使用LinkedBlockingQueue
allowCoreThreadTimeOut:设置为true的话,keepAliveSeconds参数设置的有效时间对corePoolSize线程也有效,默认是flase
threadFactory::用于设置创建线程的工厂,可以通过线程工厂给每个创建出来的线程设置更有意义的名字。使用开源框架guava提供的ThreadFactoryBuilder可以快速给线程池里的线程设置有意义的名字
rejectedExecutionHandler:拒绝策略,当队列workQueue和线程池maxPoolSize都满了,说明线程池处于饱和状态,那么必须采取一种策略处理提交的新任务。这个策略默认情况下是AbortPolicy,表示无法处理新任务时抛出异常。
三、拒绝策略
拒绝策略有以下四种,默认情况下是AbortPolicy,也可根据实际业务需求类实现RejectedExecutionHandler接口实现自己的处理策略
1.AbortPolicy:丢弃任务,并且抛出RejectedExecutionException异常;
2.DiscardPolicy:丢弃任务,不处理,不抛出异常;
3.CallerRunsPolicy:直接在execute方法的调用线程中运行被拒绝的任务;
4.DiscardOldestPolicy:丢弃队列中最前面的任务,然后重新尝试执行任务。
四、处理流程
1.查看核心线程池是否已满,不满就创建一条线程执行任务,否则执行第二步。
2.查看任务队列是否已满,不满就将任务存储在任务队列中,否则执行第三步。
3.查看线程池是否已满,即就是是否达到最大线程池数,不满就创建一条线程执行任务,否则就按照策略处理无法执行的任务。
四、代码示例
运行结果:
五、多线程同步工具用法
运行结果:
丢弃队列中最前面的任务,然后重新尝试执行任务
Original: https://www.cnblogs.com/gongxr/p/14468802.html
Author: 星瑞
Title: Java多线程之ThreadPoolTaskExecutor用法
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538056/
转载文章受原作者版权保护。转载请注明原作者出处!