Java-创建线程池的参数及工作原理

发布时间 2023-12-15 12:41:59作者: 安浩阳

Java-创建线程池的参数及工作原理

常见的参数

  1. corePoolSize(核心线程数): 线程池中保持的最小线程数,即使它们是空闲的。
  2. maximumPoolSize(最大线程数): 线程池中允许的最大线程数。
  3. keepAliveTime(线程空闲时间): 当线程池中的线程数超过核心线程数时,多余的空闲线程在被终止之前等待新任务的最长时间。
  4. unit(空闲时间的时间单位): 用于指定 keepAliveTime 的时间单位。
  5. workQueue(工作队列): 用于保存等待执行的任务的队列。
  6. threadFactory(线程工厂): 用于创建新线程的工厂。
  7. handler(拒绝策略): 当工作队列和线程池都已满时,用于处理新任务的策略。

这些参数主要用于控制线程池的大小和行为。

工作原理

(1)提交任务后,若线程数小于corePoolSize, 就创建新线程来执行,否则,放入工作队列。

(2)若工作队列已满,且线程数小于maximumPoolSize,就创建新线程执行(任务完成后超时后自动终止),否则执行对应的拒绝策略(调用者执行、抛出异常、直接丢弃任务、丢弃最老任务或者自定义)。

  1. corePoolSize 和 maximumPoolSize:

    • 当提交一个新任务时,线程池会根据 corePoolSize 的设置创建线程来处理任务。
    • 如果当前线程数小于 corePoolSize,新任务将总是创建新线程来处理。
    • 当任务数超过 corePoolSize 时,线程池可以创建多达 maximumPoolSize 个线程来处理任务,这样可以应对任务的突然增加。
    • 超过 corePoolSize 的线程在任务完成后一定时间内(由 keepAliveTime 和 unit 决定)没有新任务可执行时,将被终止。
  2. workQueue:

    • 工作队列用于保存等待执行的任务。线程池会优先使用核心线程来处理任务,当核心线程数达到上限时,新任务将被放入工作队列。
    • 在工作队列中的任务会等待核心线程空闲时执行,或者在核心线程数已满的情况下创建新线程执行,直到线程数达到 maximumPoolSize。
    • 工作队列的选择对线程池的性能有影响,常见的工作队列包括有界队列(如 ArrayBlockingQueue​)和无界队列(如 LinkedBlockingQueue​)等。
  3. threadFactory:

    • 线程工厂用于创建新的线程。通过自定义线程工厂,可以指定新线程的一些属性,例如线程名、是否为守护线程等。
  4. handler(拒绝策略):

    • 当线程池和工作队列都满了,无法执行新任务时,拒绝策略会定义如何处理这种情况。常见的拒绝策略包括由调用者执行、抛出异常、直接丢弃任务、丢弃最老的任务等。

通过调整这些参数,可以根据应用程序的需求和特性来优化线程池的性能和行为。合理设置这些参数可以有效地控制线程池的大小、并发度和任务处理效率。