线程池
前言
本文仅做文章的扩展,详情解释下每个配置. 参考文章:[传送门]
正文
一个自定义线程池
public Executor myTaskAsyncPool() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//参数设置是需要根据业务情况及设备配置等来决定
// 核心线程池大小(一般建议设置为CPU核心数的两倍)
executor.setCorePoolSize(config.getCorePoolSize());
// 最大线程数
executor.setMaxPoolSize(config.getMaxPoolSize());
// 活跃时间
executor.setKeepAliveSeconds(config.getKeepAliveSeconds());
// 队列容量
executor.setQueueCapacity(config.getQueueCapacity());
// 线程名字前缀
executor.setThreadNamePrefix("MyExecutor-");
//拒绝策略
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 初始化线程池
executor.initialize();
return executor;
配置说明:
1. 核心线程数(corePoolSize):线程池中保持活动状态的线程数量。当有新的任务提交到线程池时,线程池会创建新的线程来处理任务,直到达到核心线程数。默认情况下,核心线程会一直保持活动状态,即使没有任务需要执行
2. 最大线程数(maximumPoolSize):线程池中允许的最大线程数量。当线程池中的线程数量达到核心线程数,并且工作队列(workQueue)已满时,线程池会创建新的线程来处理任务,直到达到最大线程数。超过最大线程数的任务将根据配置的拒绝策略进行处理
3. 空闲线程存活时间(keepAliveTime):当线程池中的线程数量超过核心线程数,并且空闲时间超过指定的时间时,多余的线程将被销毁,直到线程池中的线程数量等于核心线程数
4. 工作队列(workQueue):用于存储等待执行的任务的队列。当线程池中的线程数量达到核心线程数后,多余的任务将存储在工作队列中,等待线程池中的线程来执行
5. 拒绝策略(rejectedExecutionHandler):当线程池中的线程数量达到最大线程数,并且工作队列已满时,新的任务将根据配置的拒绝策略进行处理。常见的拒绝策略包括抛出异常、丢弃任务、丢弃最旧的任务或在调用者线程中执行任务等
拒绝策略:
- AbortPolicy(默认策略):直接抛出RejectedExecutionException异常,阻止系统正常运行
- CallerRunsPolicy:由提交任务的线程来执行被拒绝的任务。这样可以降低新任务的流量,但是会影响程序的响应性能
- DiscardPolicy:直接丢弃被拒绝的任务,不做任何处理
- DiscardOldestPolicy:丢弃任务队列中最旧的任务,然后尝试重新提交被拒绝的任务
除了以上常见的拒绝策略外,还可以自定义拒绝策略,实现RejectedExecutionHandler接口,并重写rejectedExecution()方法来定义自己的拒绝策略。自定义拒绝策略可以根据具体的业务需求来处理被拒绝的任务,如记录日志、将任务放入消息队列等
不配置的话,默认赋值: