Java-创建线程池的参数及工作原理
Java-创建线程池的参数及工作原理
常见的参数
- corePoolSize(核心线程数): 线程池中保持的最小线程数,即使它们是空闲的。
- maximumPoolSize(最大线程数): 线程池中允许的最大线程数。
- keepAliveTime(线程空闲时间): 当线程池中的线程数超过核心线程数时,多余的空闲线程在被终止之前等待新任务的最长时间。
- unit(空闲时间的时间单位): 用于指定 keepAliveTime 的时间单位。
- workQueue(工作队列): 用于保存等待执行的任务的队列。
- threadFactory(线程工厂): 用于创建新线程的工厂。
- handler(拒绝策略): 当工作队列和线程池都已满时,用于处理新任务的策略。
这些参数主要用于控制线程池的大小和行为。
工作原理
(1)提交任务后,若线程数小于corePoolSize, 就创建新线程来执行,否则,放入工作队列。
(2)若工作队列已满,且线程数小于maximumPoolSize,就创建新线程执行(任务完成后超时后自动终止),否则执行对应的拒绝策略(调用者执行、抛出异常、直接丢弃任务、丢弃最老任务或者自定义)。
corePoolSize 和 maximumPoolSize:
- 当提交一个新任务时,线程池会根据 corePoolSize 的设置创建线程来处理任务。
- 如果当前线程数小于 corePoolSize,新任务将总是创建新线程来处理。
- 当任务数超过 corePoolSize 时,线程池可以创建多达 maximumPoolSize 个线程来处理任务,这样可以应对任务的突然增加。
- 超过 corePoolSize 的线程在任务完成后一定时间内(由 keepAliveTime 和 unit 决定)没有新任务可执行时,将被终止。
workQueue:
- 工作队列用于保存等待执行的任务。线程池会优先使用核心线程来处理任务,当核心线程数达到上限时,新任务将被放入工作队列。
- 在工作队列中的任务会等待核心线程空闲时执行,或者在核心线程数已满的情况下创建新线程执行,直到线程数达到 maximumPoolSize。
- 工作队列的选择对线程池的性能有影响,常见的工作队列包括有界队列(如
ArrayBlockingQueue
)和无界队列(如LinkedBlockingQueue
)等。threadFactory:
- 线程工厂用于创建新的线程。通过自定义线程工厂,可以指定新线程的一些属性,例如线程名、是否为守护线程等。
handler(拒绝策略):
- 当线程池和工作队列都满了,无法执行新任务时,拒绝策略会定义如何处理这种情况。常见的拒绝策略包括由调用者执行、抛出异常、直接丢弃任务、丢弃最老的任务等。
通过调整这些参数,可以根据应用程序的需求和特性来优化线程池的性能和行为。合理设置这些参数可以有效地控制线程池的大小、并发度和任务处理效率。