你不得不掌握的线程池
小明 Lv6

线程池的类型

在Java中,线程池的类型主要有以下几种:

  1. FixedThreadPool(固定大小线程池):该类型的线程池固定了线程的数量,适用于一些稳定且长期执行的任务。当线程池中的线程都处于忙碌状态时,新的任务会在队列中等待执行。

  2. CachedThreadPool(缓存线程池):该类型的线程池会根据需要自动创建新的线程,适用于短期的异步任务。当线程池中有空闲线程时,新的任务会被立即执行;当所有线程都忙碌时,会创建新的线程来处理任务。

  3. SingleThreadPool(单线程池):该类型的线程池只有一个线程,适用于需要保证任务顺序执行的场景。所有的任务按照提交的顺序依次执行,如果线程因异常终止,会创建一个新线程继续执行后续任务。

  4. ScheduledThreadPool(定时任务线程池):该类型的线程池用于定时或延迟执行任务。可以按照特定的时间间隔或者指定的延迟时间来执行任务。

除了以上几种常见的线程池类型,还可以通过ThreadPoolExcuter创建线程池,可灵活的控制核心线程数量、最大线程数量,阻塞队列以及拒绝策略,不建议使用无界队列;

1
2
3
4
5
6
7
8
9
10
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(
5, // corePoolSize 核心线程数,即线程池中始终保持活动状态的线程数量。
10, // maximumPoolSize 最大线程数,即线程池中允许存在的最大线程数量,当阻塞队列满的情况下,才会增加新的线程直到最大。
60, // keepAliveTime 线程空闲时间,当线程池中的线程数大于 corePoolSize 时,多余的空闲线程最大存活时间。
TimeUnit.SECONDS, // unit keepAliveTime 的时间单位。
new ArrayBlockingQueue<>(100), // workQueue 任务队列,保存等待执行的任务的阻塞队列。
Executors.defaultThreadFactory(), // threadFactory 线程工厂,用于创建新线程。
new ThreadPoolExecutor.AbortPolicy() // handler 拒绝策略,当线程池和任务队列都满了之后,新任务的处理方式。
);

线程池的拒绝策略

当线程池已满无法接受新的任务时,可以采用以下几种常见的拒绝策略:

  1. AbortPolicy(默认):直接抛出RejectedExecutionException异常,阻止系统接受新的任务提交。
  2. CallerRunsPolicy:将任务退回给调用者,由调用线程执行该任务。这样可以降低任务提交速度,但可能会影响调用线程的性能。
  3. DiscardPolicy:默默地丢弃无法处理的任务,不抛出异常也不通知任务提交者。
  4. DiscardOldestPolicy:丢弃最早提交的任务,并尝试重新提交当前任务。
  5. 自定义拒绝策略:根据业务需求自定义一个实现了RejectedExecutionHandler接口的拒绝策略。

选择合适的拒绝策略需要根据具体情况和业务需求来确定。可以根据线程池的负载情况、任务优先级等因素进行综合考虑,以提供最适合的处理方式。

线程池执行流程

初始化线程池时,未添加线程任务,线程池中是不会创建任何线程,存活线程为0,工作队列为0。
image

关注获取更多资源

image
 评论