线程池(Thread Pool)是Java并发编程中用于管理和复用线程的重要工具。通过线程池,可以避免频繁创建和销毁线程的开销,提高系统性能和资源利用率。
一、核心参数
1、corePoolSize(核心线程数)
- 作用
- 线程池中保持的最小线程数,即使这些线程处于空闲状态,也不会被销毁
- 默认值
- 需要手动设置,没有默认值
- 使用场景
- 根据任务量和系统资源设置合理的核心线程数
2、maximumPoolSize(最大线程数)
- 作用
- 线程池中允许的最大线程数
- 当任务数量超过核心线程数且工作队列已满时,线程池会创建新线程,直到线程数达到最大线程数
- 默认值
- 需要手动设置,没有默认值
- 使用场景
- 根据系统负载和资源限制设置合理的最大线程数
3、KeepAliveTime(线程空闲时间)
- 作用
- 当线程池中的线程数量超过核心线程数时,空闲线程的最大存活时间
- 超过该事件后,空线程会被销毁,直到线程数恢复到核心线程数
- 默认值
- 需要手动设置,没有默认值
- 使用场景
- 根据任务的特点设置合理的空闲时间,避免资源浪费
4、unit(时间单位)
- 作用
- keepAliveTime的时间单位
- 常用值
- TimeUnit.SECONDS、TimeUnit.MILLISECONDS等。
- 默认值
- 需要手动设置,没有默认值
5、workQueue(工作队列)
- 作用
- 用于存放待执行任务的阻塞队列
- 当线程池中的线程数达到核心线程时,新任务会被放入工作队列
- 常用实现
- LinkedBlockingQueue:无界队列,任务数量不受限制
- ArrayBlockingQueue:有界队列,任务数量受队列容量限制
- SynchronousQueue:不存储任务,直接将任务交给线程处理
- 默认值
- 需要手动设置,没有默认值
- 使用场景
- 根据任务的特点选择合适的队列类型
6、threadFacotory(线程工厂)
- 作用
- 用于创建新线程的工厂
- 可以自定义线程的名称、优先级、是否为守护线程等
- 默认值
- 如果没有指定,使用Executors.defaultThreadFactory()
- 使用场景
- 需要自定义线程属性时使用
7、handler(拒绝策略)
- 作用
- 当线程池中的线程数达到最大线程数且工作队列已满时,用于处理新任务的策略
- 常用实现
- AbortPolicy:直接抛出RejectedExecutionException异常(默认策略)
- CallerRunsPolicy:由提交任务的线程直接执行该任务
- DiscardPolicy:直接丢弃任务,不抛出异常
- DiscardOldestPolicy:丢弃队列中最旧的任务,然后重新提交任务
- 默认值:
- 如果没有指定,使用AbortPolicy
- 使用场景
- 根据业务需求选择合适的拒绝策略
二、线程池的工作流程
1、提交任务
- 当有新任务提交时,线程池首先检查当前线程数是否小于核心线程数
- 如果小于,则创建新线程执行任务
2、放入队列
- 如果线程数达到核心线程数,则将任务放入工作队列
3、创建新线程
- 如果工作队列已满且线程数小于最大线程数,则创建新线程执行任务
4、拒绝任务
- 如果线程数已达到最大线程数且工作队列已满,则根据拒绝策略处理任务
三、线程池的创建
Java提供了ThreadPoolExecutor类来创建自定义线程池,同时也提供了Executors工具类创建常用的线程池
1、自定义线程池
int corePoolSize = 5;
int maximumPoolSize = 10;
long keepAliveTime = 60;
TimeUnit unit = TimeUnit.SECONDS;
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
ThreadFactory threadFactory = Executors.defaultThreadFactory();
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
ThreadPoolExecutor executor = new ThreadPoolExecutor(
corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler
);
2、使用Executors创建线程池
-
固定大小线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
-
单线程线程池
ExecutorService executor = Executors.newSingleThreadExecutor();
-
缓存线程池
ExecutorService executor = Executors.newCachedThreadPool();
-
定时任务线程池
ScheduledExecutorService executor = Executors.newScheduledThreadPool(10);
四、总结
线程池的核心参数包括:
corePoolSize
:核心线程数。maximumPoolSize
:最大线程数。keepAliveTime
:线程空闲时间。unit
:时间单位。workQueue
:工作队列。threadFactory
:线程工厂。handler
:拒绝策略。